我有一个应用程序,您可以在其中创建新类型的产品并添加到该产品的某些成分。产品和成分都是保存在数据库中的实体。产品实体具有一组成分实体。实体4.1用新子实体更新现有父实体
(简体版)
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。然而,在状态改变I的情况下,得到异常“ObjectStateManager中已存在具有相同密钥的对象”。
myDataContext.Entry(product).State = EntityState.Modified
后“一些”寻找我想通了,问题是,所有的成分具有0的主键(因为它们没有添加),当您更改父实体的状态(产品),所有的子实体(成分)都与关键字0相关联,这导致问题,因为关键字不再是唯一的。
我一直在寻找解决方案,但无法弄清楚如何解决这个问题。在尝试更改状态之前,我尝试将其添加到上下文中,但是产品和配料之间的链接缺失......如何使用新的尚未添加的子实体更新现有的父实体?
我使用Entity Framework 4.1和Code First。
希望你能帮助我!
这个绝对完美的作品!多谢! – DirkDooms
花了很长时间才找到如何正确更新实体。感谢context.Entry(productInDb).CurrentValues.SetValues(product); –
这真是太好了,现在我只需要弄清楚如何通过反射使它工作,这样我就可以遍历我正在保存的实体上的所有集合。 – Nikkoli