【发布时间】:2011-12-19 14:17:38
【问题描述】:
我有一个应用程序,您可以在其中创建一种新型产品并向该产品添加一些成分。产品和成分都是保存在数据库中的实体。产品实体具有成分实体的集合。
(简化版)
public class Product
Public Sub New()
Me.Ingredients = New List(Of Ingredient)()
End Sub
Property Ingredients as ICollection(Of Ingredient)
end class
当我第一次保存产品时,一切都很顺利:我只需将它添加到上下文并调用 SaveChanges。
myDataContext.Products.Add(product)
myDataContext.SaveChanges()
产品(父)和成分(子)都被保存并相互链接。一切都很好。
但是,当我在现有产品中添加/删除成分时,我开始遇到问题。我首先清除产品实体中现有的成分集合,然后再次添加更新的成分列表(我不重复使用成分添加时刻)。然后我将产品实体的状态更改为已修改并调用 savechanges。但是,在状态更改时,我得到异常“ObjectStateManager 中已存在具有相同键的对象”。
myDataContext.Entry(product).State = EntityState.Modified
经过“一些”搜索后,我发现问题在于所有成分的主键均为 0(因为它们尚未添加),当您更改父实体(产品)的状态时,所有子实体实体(成分)使用键 0 附加到上下文,这会导致问题,因为键不再唯一。
我一直在寻找解决方案,但不知道如何解决这个问题。我尝试在更改状态之前将成分添加到上下文中,但是缺少产品和成分之间的链接...如何使用新的尚未添加的子实体更新现有父实体?
我使用 Entity Framework 4.1 和 Code First。
希望你能帮助我!
【问题讨论】: