ASP.NET PUT失败,出现DbUpdateConcurrencyException

时间:2018-10-29 08:45:16

标签: c# entity-framework-core optimistic-concurrency

我有一个带有脚手架式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",
}

任何帮助将不胜感激。谢谢。

1 个答案:

答案 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();
}