Entity Framework コード ファースト アプローチの使用。
2 つのエンティティ クラスがあるとします。
[Table("Objects")]
public class DbObject : IValidatableObject
{
public long Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<DbObjectProperty> Properties { get; set; }
}
[Table("ObjectProperties")]
public class DbObjectProperty
{
public long Id { get; set; }
public string Name { get; set; }
public string Value { get; set; }
[Display(Name = "Object"), UIHint("Object")]
public long ObjectId { get; set; }
public virtual DbObject Object { get; set; }
}
ここでの注意点:
DbObject
ナビゲーション プロパティのみがあり、外部キーを持つ列はありませんDbObjectProperty
ナビゲーション プロパティと、外部キーを持つ対応する列があります- オブジェクトを削除する場合、そのプロパティも一緒に移動したいのは明らかですが、1 つのプロパティを削除した場合、オブジェクト全体が消えてしまうのは望ましくありません。
DB コンテキストのOnModelCreating
メソッドでは、これまで次の関係を定義していました。
modelBuilder.Entity<DbObjectProperty>()
.HasRequired(op => op.Object)
.WithMany(obj => obj.Properties)
.HasForeignKey(op => op.ObjectId)
.WillCascadeOnDelete(false);
もちろん、これはカスケード削除が発生しないことを意味します。私の質問は、これを に変更した場合true
、それは私が望むことですか? オブジェクトを削除する場合は、そのプロパティも一緒に移動したいのですが、1 つのプロパティを削除した場合にオブジェクト全体が消えてしまうのは望ましくありません。
この変更 ( からfalse
へtrue
) に対して自動生成された移行コードは次のとおりです。
DropForeignKey("ObjectProperties", "ObjectId", "Objects");
DropIndex("ObjectProperties", new[] { "ObjectId" });
AddForeignKey("ObjectProperties", "ObjectId", "Objects", "Id", cascadeDelete: true);
CreateIndex("ObjectProperties", "ObjectId");
プロパティを削除すると、関連付けられたオブジェクトが削除されることを暗示しているように見えるのではないかと心配しています。しますか?