【问题标题】:Entity Framework Remove. Why do I need to set the entity state?实体框架删除。为什么需要设置实体状态?
【发布时间】:2014-08-21 23:35:59
【问题描述】:

我使用以下代码 sn-p 删除带有子设计记录的父 Job 记录。

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

错误是

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

【问题讨论】:

    标签: entity-framework-6


    【解决方案1】:

    它告诉您删除该记录会违反外键约束。

    如果我有以下表格:

    客户

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

    订购

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

    对于这个例子,OrderOrder.CustId = Customer.id 有一个外键约束,我无法从我的 Customer 中删除 Barry表,除非我首先删除了 Order 表中的所有 Barry 引用,因为外键约束(Order 中的任何内容都带有 custId 共 1)

    正如错误信息所解释的,

    当对关系进行更改时,相关的外键 属性设置为空值。

    通过从 Customer 中删除 Barry,您将不再拥有 ID 为 1 的 Customer 记录。这将违反约束,因为它会尝试将不可为空的整数(userId in Order)设置为空值。

    我建议查看Foreign Key Constraints

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

    【讨论】:

    • 感谢@silencedmessage。我的困惑是我以为我在删除工作记录之前的设计记录。但是,从集合中删除与从数据库中删除不同。
    • 适当注明。猜猜我有点过头了。感谢您的反馈。
    【解决方案2】:

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

    因此答案是使用

    connect.design.Remove(delDesign)
    

    【讨论】:

      猜你喜欢
      • 2011-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      相关资源
      最近更新 更多