我的应用程序允许用户通过UI创建新实体的层次结构 - 假设它是“客户”加上一个或多个子“订单”实体。用户还将每个Order实体分配给现有的“OrderDiscount”实体(将这些实体视为从数据库中检索的“引用”/“查找”项)。一段时间后,用户将选择将整个层次结构保存到数据库中,如下所示: -
using (var context = new MyContext())
{
context.Customers.Add(customer);
foreach (var entity in context.OrderDiscounts.Local)
{
objectStateManager.ChangeObjectState(entity, EntityState.Unchanged);
}
context.SaveChanges();
}
foreach
循环将OrderDiscount实体的状态更改为Unchanged,并阻止EF尝试将它们插入数据库,从而导致重复。
到目前为止很棒,但我现在又遇到了另一个问题。由于我不会进入的原因,OrderDiscount实体可能来自不同的BLL调用,导致图中的两个订单可能出现以引用相同的OrderDiscount(即两者具有相同的PK) ID和其他属性),但实体是不同的对象引用。
当我保存时,上面的foreach
循环失败并显示消息“AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突。在调用AcceptChanges之前,请确保键值是唯一的“。我可以在context.OrderDiscounts.Local
集合中看到两个具有相同PK ID的OrderDiscount对象。
我不确定如何避免这种情况。有什么建议吗?
本文(http://msdn.microsoft.com/en-us/magazine/dn166926.aspx)描述了该场景,并提供了一种可能的解决方案,即仅设置FK ID(order.OrderDiscountId
),并使order.OrderDiscount
关系保持为空。不幸的是,在我的情况下这是不可行的,因为我更依赖于能够遍历这种关系,例如ApplyDiscount(order.OrderDiscount);
。