将新实体添加到附加实体中的集合会导致ConcurrencyException

时间:2014-06-11 10:21:14

标签: entity-framework dbcontext

我已经简化了下面的代码来显示问题的根源。我的真正代码是使用GenericRepository和UnitOfWork模式,但我也得到了与此简化代码相同的异常。 我正在使用Entity Framework 6,Code First

它使用以下POCO实体

public class Order 
{
    public int Id {get;set;}
    public virtual List<OrderProducts> OrderProducts {get;set;}
    ...

}

public class Product
{
    public int Id {get;set;}
    ...
}

public class OrderProduct
{
    public int OrderId {get;set;}
    public int ProductId {get;set;}
    public int Quantity
    public virtual Order Order { get; set; }
    public virtual Product Product{ get; set; }
}

The user is able to create a new product and add it to the order products on the same screen.

//Pull an order from the database:
var existingOrder = db.Orders.FirstOrDefault(x => x.Id == inputModel.OrderId);

//Iterate the OrderProductInputModels (IMs) in the Inputmodel
foreach (var orderProductIM in inputModel.OrderProductIMs )
{
    var orderProduct = existingOrder.OrderProducts.SingleOrDefault(o => o.Id == orderProductIM.Id);

    //if its an existing order product (already in db)
    if (orderProduct != null)
    {
       //just update its property values
    }
    //if it has been added
    else 
    {
        //we need to create a new product first
        var newProduct= new Product() { <set some properties> };
        orderProduct= new OrderProduct()
        {
            Product=newProduct,
            Order=existingOrder
        }

        //Add the OrderProduct to the order
        existingOrder.OrderProducts.Add(orderProduct);
    }

db.SaveChanges();

在保存更改时,我收到以下错误。

[System.Data.Entity.Infrastructure.DbUpdateConcurrencyException] = {“存储更新,插入或删除语句影响了意外的行数(0)。实体可能在加载实体后被修改或删除。刷新ObjectStateManager条目。“}

为什么会这样?

我希望实体框架能够看到nowOrders嵌套属性是新添加和未附加的,更新订单并创建新的OrderProduct和Product。

3 个答案:

答案 0 :(得分:0)

如果你正在检查null,那么你的if子句是否应该是其他方式(那么只有它是一个新的订单产品,否则更新。问题在这里:

 //if its an existing order product (already in db)
if (orderProduct == null)
{
   //just update its property values
}
//if it has been added
else 
{

答案 1 :(得分:0)

当您循环所有OrderProducts时,您不断更新数据库,但不会刷新existingOrder对象。首先更新或添加所有对象,然后更新数据库。

答案 2 :(得分:0)

最后通过创建测试项目和反向代码来解决它,首先设计数据库。注意到未生成OrderProduct实体。在检查数据库时,未设置主键。在数据库中设置主键后,问题就解决了。感谢您的所有建议。