【发布时间】:2017-06-30 13:09:44
【问题描述】:
我有下面的代码从父母那里删除孩子和孙子
MyEntities dbContext = new MyEntities();
var parent = dbContext.Parents
.Include(x => x.Childrens.Select(y => y.GrandChildrens))
.Where(x => x.ParentID == 1)
.SingleOrDefault();
// get first child
var child = parent.Childrens.First();
// remove all grand childrens from child
var count = child.GrandChildrens.Count;
for (int i = 0; i < count; i++)
{
child.GrandChildrens.Remove(child.GrandChildrens.ElementAt(0));
}
// remove child from parent
parent.Childrens.Remove(child);
// save changes
dbContext.SaveChanges();
以上代码抛出异常
操作失败:无法更改关系,因为 一个或多个外键属性不可为空。当一个 对关系进行更改,相关的外键属性是 设置为空值。如果外键不支持空值, 必须定义一个新的关系,外键属性必须是 分配了另一个非空值,或者不相关的对象必须是 已删除。
在阅读了几篇文章之后,我似乎必须将实体的状态标记为已删除,而不是从集合中删除实体。
MyEntities dbContext = new MyEntities();
var parent = dbContext.Parents
.Include(x => x.Childrens.Select(y => y.GrandChildrens))
.Where(x => x.ParentID == 1)
.SingleOrDefault();
// get first child
var child = parent.Childrens.First();
// remove all grand childrens from child
var count = child.GrandChildrens.Count;
for (int i = 0; i < count; i++)
{
dbContext.Entry<GrandChild>(child.GrandChildrens.ElementAt(0)).State = EntityState.Deleted;
}
// remove child from parent
dbContext.Entry<Child>(child).State = EntityState.Deleted;
// save changes
dbContext.SaveChanges();
上面的代码有效
但是我有问题
1> 如何启用级联删除,这样我就不必明确删除 GrandChildrens?我正在使用数据库优先方法。
2> 如果我们将实体添加到集合中并调用 dbContext.SaveChanges() 则 EF 会保存新添加的实体,即使我们没有将实体的状态显式标记为 Added。为什么删除操作不是这样?为什么我们必须将实体的状态显式设置为Deleted
【问题讨论】:
标签: entity-framework asp.net-mvc-5