MVC4 と EF コードを最初に使用して Web サイトを開発しています。
1対多の関係を持つエンティティの子を削除する際に問題があります。
明確にするために編集:私の編集ビューでは、親の子コレクションに既存の子を追加/削除/更新します。追加/削除は JavaScript を使用して行われます。コントローラー メソッドのポスト リクエストで更新された親を受け取ったら、データベース内の親エンティティと子エンティティを同期/更新したいと考えています。ビューで更新されると、親オブジェクトは切り離された状態になります。そのため、親を再度アタッチするときに、デタッチされた状態で行われたすべての更新を行うようにします。
エンティティ関係は、親コレクションから子エンティティを削除すると、子エンティティも子テーブルから削除されるように設定され (カスケード削除のようなものですか?)、これはアタッチされた状態で機能します。
ただし、親をアタッチして変更を保存すると、追加/更新された子のみがデータベースに追加/変更されます。しかし、親コレクションから削除された子は、データベースで削除されません(私はそれらを削除したいのです)。
これはどうすれば解決できますか??
エンティティは次のとおりです。
class Parent
{
public virtual ICollection<Child> Children { get; set; }
}
class Child
{
public string Text { get; set; }
}
これは機能し、データベースから子を削除します:
void RemoveChildFromCollection()
{
// get the first parent and remove the first child in collection
var context = new DatabaseContext();
var parent = context.Parents.First();
parent.Children.Remove(parent.Children.First());
context.SaveChanges();
}
ControllerMethod:これは上記のようには機能しません。削除された子は子テーブルから削除されません。
public ActionResult Edit(Parent parent)
{
var context = new DatabaseContext();
context.Entry(parent).State = System.Data.EntityState.Modified;
context.SaveChanges();
return View();
}
モデルビルダーは、親コレクションから子エンティティを削除するときに、子テーブルから子エンティティを削除するように設定されています
// Use Identifying relation. Define complex key for ChildObject containing both Id and
ParentObjectId
modelBuilder.Entity<Child>()
.HasKey(c => new {c.ChildID, c.ParentID});
// Because defining such key will remove default convention for auto incremented Id you must redefine it manually
modelBuilder.Entity<Child>()
.Property(c => c.ChildID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
// Set cascade delete
modelBuilder.Entity<Parent>()
.HasMany(p => p.Children)
.WithRequired()
.HasForeignKey(c => c.ParentID)
.WillCascadeOnDelete();