我使用以下代码段删除包含子设计记录的父作业记录。
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);
}
错误是
由于一个或多个外键属性不可为空,因此无法更改关系。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。
答案 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 )设置为空值。
假设您尝试删除的作业没有其他键,则可以在删除与该作业关联的所有设计记录后删除作业条目。 只有在您100%确信永远不再需要设计记录的情况下才能这样做。
答案 1 :(得分:1)
问题是我从Job的设计集合中删除了Design。相反,我应该从实体集中删除设计
因此答案是使用
connect.design.Remove(delDesign)