我有一个带有脚手架式ApiController
的Web API。在更新方法(PUT
中,以下代码段将更新数据库中的实体。
_context.Entry(customers).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!CustomersExists(id))
{
return NotFound("Not found");
}
else
{
throw;
}
}
但是我发现这仅更新Customer
模型中的属性,而不会传播到引用的实体。例如,“有订单”表存储每个客户的订单。
public partial class Customers
{
public Customers()
{
Orders= new HashSet<Orders>();
}
public string Description { get; set; }
public string Name { get; set; }
public virtual ICollection<Orders> Orders { get; set; }
}
因此,更新客户的请求也可以具有更新的订单详细信息。但是,
_context.Entry(customers).State = EntityState.Modified;
如果有更改,此行无法更新Orders表。在尝试了许多方法之后,我发现了
_context.Customers.Update(customers);
可成功更新所有内容。但是问题在于,如果当前请求只有2个订单,而更新请求又有3个订单,那么更新将再次失败。
Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException:数据库 该操作预期会影响1行,但实际上会影响0行。 自加载实体以来,数据可能已被修改或删除。
编辑:与数据库没有任何连接。因此并发异常是不可能的。
我的JSON请求看起来像这样。
{
"orders":[
{
"id": "1",
"date": "2018/10/29"
},
{
},
],
"name":"test_name",
"description":"test_description",
}
任何帮助将不胜感激。谢谢。
答案 0 :(得分:0)
我有同样的问题。我在一个新项目上使用EF Core 2。
编辑后操作方法会在任何更新中生成一个DbUpdateConcurrencyException
。
_context.Update(participant);
await _context.SaveChangesAsync();
我必须用以下内容替换上面的两行:
var participantToUpdate = await _context.Participants.SingleOrDefaultAsync(p => p.ParticipantID == participant.ParticipantID);
if (await TryUpdateModelAsync<Participant>(participantToUpdate, "", p => p.Nom, p => p.Email))
{
await _context.SaveChangesAsync();
}