0

我的应用程序允许用户通过 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 实体的状态更改为未更改,并阻止 EF 尝试将它们插入数据库,从而导致重复。

到目前为止很好,但我现在遇到了另一个问题。由于我不会深入讨论的原因,OrderDiscount 实体可能来自不同的 BLL 调用,从而导致图中的两个 Order 可能似乎引用相同的 OrderDiscount(即两者具有相同的 PK ID 和其他属性),但实体是不同的对象引用。

当我保存时,上面的foreach循环失败并显示消息“AcceptChanges cannot continue because the object's key values conflict with another object in the ObjectStateManager.请确保在调用 AcceptChanges 之前键值是唯一的”。我可以看到context.OrderDiscounts.Local集合中的两个 OrderDiscount 对象,它们都具有相同的 PK ID。

我不确定如何避免这种情况。有什么建议么?

本文 ( http://msdn.microsoft.com/en-us/magazine/dn166926.aspx ) 描述了该方案并提供了一种可能的解决方案,即仅设置 FK ID ( order.OrderDiscountId),并将order.OrderDiscount关系保留为空。不幸的是,在我的情况下这是不可行的,因为我依赖于能够遍历这样的关系,例如ApplyDiscount(order.OrderDiscount);.

4

0 回答 0