我正在使用带有 EF 代码优先方法的 MVC4 开发一个网站。
我在删除具有一对多关系的实体中的孩子时遇到了一些问题。
编辑以清除:在我的编辑视图中,我在父级的子集合中添加/删除/更新现有子项,添加/删除是使用 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();