异常消息:
操作失败:无法更改关系,因为 一个或多个外键属性是不可为空的。当一个 改变了关系,相关的外键属性是 设置为空值。如果外键不支持空值, 必须定义新的关系,外键属性必须是 分配了另一个非空值,或者不相关的对象必须是 删除。
Resque.enqueue_at <what to put here>, SendSmsJob
我在删除时有级联。如果我删除了数据库中的Foobar,所有Foos也会删除 - 所以Cascade删除工作。
为什么我从EF 6获得此例外?
编辑:
如果我使用此代码:
public int Delete(Foobar item) { using (var ctx = new DataContext()) { ctx.Entry(item).State = EntityState.Deleted; foreach (var singleFoo in item.Foos) { ctx.Entry(singleFoo ).State = EntityState.Deleted; } return ctx.SaveChanges(); } }
一切都按照我的预期运作。但我想知道为什么?
答案 0 :(得分:1)
这个问题将通过不使用EntityState
而只是删除实体来解决:
ctx.Foobars.Remove(item);
如果在删除级联时,Remove()
方法也将删除子实体,因为您在定义关系的DbContext上使用它(注意您也必须将它放在EF中,不仅数据库!),EntityState.Deleted
只会在objectContext中将实体的状态标记为已删除,并在您调用SaveChanges()
时尝试删除此实体。如果实体之间的关系是可选的,那么这将起作用,那么当您将更改保存到数据库时,子实体的外键属性将设置为null
。
当您使用分离的实体时,您应该只使用EntityState
,这样您仍然可以对实体进行更改,而无需先从数据库中获取它们,进行更改,然后再次保存它们。