尝试使用Entity Framework保存带有已删除子对象列表的对象时,我遇到了一个奇怪的错误。
具体来说,我有一个'a'类型的对象列表。这些对象通过类型为“b”的连接对象相互连接。 'a'对象可以容纳许多'b'对象,每个'b'对象只包含一个'a'对象。所以基本上,我有一个'a'对象的网络,通过'b'对象与其他'a'对象有0或更多的连接。
给定的'a'对象的'b'对象列表是可变的;可以在'a'对象列表中添加或删除'b'对象。但是,当从'a'对象的列表中删除'b'对象时,这有时会导致实体框架在稍后尝试保存'a'对象的网络时出错。 'a'对象的'b'对象删除代码如下所示:
public void RemoveConnection(b connectionObject)
{
myBObjects.remove(connectionObject);
}
此代码在代码运行时正常工作,并且'a'对象在保存时具有正确的'b'对象列表。以下是保存代码:
using (var db = new PersistenceContext())
{
db.NetworkOfAs.Add(network);
db.SaveChanges();
}
如果一个'b'对象从未从'a'对象的'b'对象列表中删除,则上述工作正常。如果从'a'对象的'b'对象列表中删除'b'对象但是'b'对象的列表仍然大于或等于长度1,则上述也可以正常工作。但是,如果添加了'b'对象,然后从'a'对象的'b'对象列表中删除,使'a'对象的'b'对象列表返回长度0,则会出现以下错误:< / p>
The INSERT statement conflicted with the FOREIGN KEY constraint
"FK_dbo.BObjects_dbo.AObjects_Id". The conflict occurred in database
"NetworkDatabase.PersistenceContext\", table \"dbo.AObjects\", column 'Id'
我已经开始调试这几天了,看起来很明显这是由实体框架试图保存已经从给定'a'对象列表中删除的'b'对象引起的。 'b'对象。但是,我不知道如何防止这种情况,似乎无法找到描述这一特定问题的任何内容。
非常感谢任何帮助,如果这个解释缺少任何必要的细节,请告诉我。
答案 0 :(得分:0)
根据您暴露的异常,我会说有B对象保存在Db中,然后您只需删除它们对A对象的引用,而不是实际删除它自己的对象。因此,如果没有引用,它将与B对象的外键冲突。