更改相关实体列表的实体状态

时间:2012-03-20 21:24:58

标签: c# entity-framework-4

此代码:

orderContext.ShippingOrders.AddObject(shippingOrder);
orderContext.ObjectStateManager.ChangeObjectState(shippingOrder, System.Data.EntityState.Modified);

foreach (var shippingOrderItem in shippingOrder.ShippingOrderItems) {
    //Exception happens here.
    orderContext.ObjectStateManager.ChangeObjectState(shippingOrderItem, System.Data.EntityState.Modified);
}

此异常中的结果:AcceptChanges cannot continue because the object's key values conflict with another object in the ObjectStateManager. Make sure that the key values are unique before calling AcceptChanges。异常消息对我来说似乎很混乱,因为我只有一个对象是关系的一部分(shippingOrderItem),所以不可能是重复的密钥。

父对象(shippingOrder)处于分离状态,我不想插入新的shippingOrderItems;我想更新现有的。如何更改要修改的状态?

我正在使用的对象的伪类结构如下所示:

public class ShippingOrder {
    public List<ShippingOrderItem> ShippingOrderItems { get; set; }
}

public class ShippingOrderItem {
    //This is the where I need to insert new records!  Everything else is an update.
    public List<ShippingOrderItemSerialNumber> ShippingOrderItemSerialNumbers { get; set; }
}

2 个答案:

答案 0 :(得分:3)

代码中行的顺序很重要。我无法解释,为什么。但我可以通过交换代码中的一些行来重现您的错误并解决它:

using (var orderContext = new ShippingEntities())
{
    orderContext.ShippingOrders.AddObject(shippingOrder);
    foreach (var shippingOrderItem in shippingOrder.ShippingOrderItems)
    {
        orderContext.ObjectStateManager.ChangeObjectState(
            shippingOrderItem, EntityState.Modified);
    }
    orderContext.ObjectStateManager.ChangeObjectState(
        shippingOrder, EntityState.Modified);

    orderContext.SaveChanges();
}

此更新shippingOrder和所有shippingOrder.ShippingOrderItems并插入所有ShippingOrderItemSerialNumbersshippingOrdershippingOrder.ShippingOrderItems的主键属性值必须正确并且对应于数据库中的现有行。 ShippingOrderItemSerialNumbers的主键属性值无关紧要,您可以将它们全部留给0(如果它们是数据库中的自动生成标识)。

答案 1 :(得分:0)

你想要附加它然后标记为修改(AddObject用于添加一些插入内容,如Slauma所说)。

RIA做到了这一点,他们为你添加了一个扩展方法来执行2:

http://msdn.microsoft.com/en-us/library/ff423414(VS.110).aspx

然而,当然,做自己很简单。