我已经简化了下面的代码来显示问题的根源。我的真正代码是使用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。
答案 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实体。在检查数据库时,未设置主键。在数据库中设置主键后,问题就解决了。感谢您的所有建议。