了解删除时的EF 6异常

时间:2016-01-12 09:01:06

标签: c# entity-framework

异常消息:

  

操作失败:无法更改关系,因为   一个或多个外键属性是不可为空的。当一个   改变了关系,相关的外键属性是   设置为空值。如果外键不支持空值,   必须定义新的关系,外键属性必须是   分配了另一个非空值,或者不相关的对象必须是   删除。

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();
        }
    }

一切都按照我的预期运作。但我想知道为什么?

1 个答案:

答案 0 :(得分:1)

这个问题将通过不使用EntityState而只是删除实体来解决:

ctx.Foobars.Remove(item);

如果在删除级联时,Remove()方法也将删除子实体,因为您在定义关系的DbContext上使用它(注意您也必须将它放在EF中,不仅数据库!),EntityState.Deleted只会在objectContext中将实体的状态标记为已删除,并在您调用SaveChanges()时尝试删除此实体。如果实体之间的关系是可选的,那么这将起作用,那么当您将更改保存到数据库时,子实体的外键属性将设置为null

当您使用分离的实体时,您应该只使用EntityState,这样您仍然可以对实体进行更改,而无需先从数据库中获取它们,进行更改,然后再次保存它们。