此代码:
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; }
}
答案 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
并插入所有ShippingOrderItemSerialNumbers
。 shippingOrder
和shippingOrder.ShippingOrderItems
的主键属性值必须正确并且对应于数据库中的现有行。 ShippingOrderItemSerialNumbers
的主键属性值无关紧要,您可以将它们全部留给0
(如果它们是数据库中的自动生成标识)。
答案 1 :(得分:0)
你想要附加它然后标记为修改(AddObject用于添加一些插入内容,如Slauma所说)。
RIA做到了这一点,他们为你添加了一个扩展方法来执行2:
http://msdn.microsoft.com/en-us/library/ff423414(VS.110).aspx
然而,当然,做自己很简单。