实体框架删除。为什么我需要设置实体状态?

时间:2014-08-21 23:36:00

标签: entity-framework-6

我使用以下代码段删除包含子设计记录的父作业记录。

 foreach (var item in data.Items.Where(i => i.DeletePending == true && i.ItemId > 0))
{
    var deljob = connect.job.Include(j => j.Design).Single(j => j.JobID == item.ItemId);
    foreach (var delDesign in deljob.Design.ToArray())   
    {
        // next line is needed or it fails
        connect.Entry(delDesign).State = EntityState.Deleted;
        deljob.xVivDesign.Remove(delDesign);
    }
    // no need to set the state here
    connect.job.Remove(deljob);
}

错误是

由于一个或多个外键属性不可为空,因此无法更改关系。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

2 个答案:

答案 0 :(得分:1)

它告诉你,通过删除该记录会有违反的外键约束。

如果我有以下表格:

<强>客户

Id   | Name   | Age
---------------------
1    | Barry  | 52

<强>顺序

Id   | CustId   | OrderAmount
------------------------------
1    |   1      | 27.39

对于此示例,订单Order.CustId = Customer.id上有外键约束,我无法从客户中删除 Barry table,除非我首先删除了订单表中 Barry 的所有引用,因为外键约束(订单中的任何内容带有< em> custId 1)

正如错误信息所述,

  

当对关系进行更改时,相关的外键   property设置为null值。

通过从客户中删除 Barry ,您不再拥有ID为1的客户记录。这将违反约束条件,因为它会尝试将一个不可为空的整数(订单中的 userId )设置为空值。

我建议查看Foreign Key Constraints

假设您尝试删除的作业没有其他键,则可以在删除与该作业关联的所有设计记录后删除作业条目。 只有在您100%确信永远不再需要设计记录的情况下才能这样做。

答案 1 :(得分:1)

问题是我从Job的设计集合中删除了Design。相反,我应该从实体集中删除设计

因此答案是使用

connect.design.Remove(delDesign)
相关问题