ASP.NET Core 2 Controller PUT方法因并发核心而失败

时间:2018-04-13 22:06:01

标签: entity-framework asp.net-core entity-framework-core

我有一个ASP.NET Core 2.0站点,它有一个直接由简单模型和简单上下文构建的脚手架控制器。我通过简单地检查GET方法中的记录数来播种数据,如果是0,那么我添加了100条记录。 GET正在重复检索记录。

我正在使用内存数据库提供程序。

services.AddDbContext<MyDbContext>
            (opt => opt.UseInMemoryDatabase("CodeCampInMemoryDb"));

当我使用我在GET中存在的记录执行PUT时,我会收到并发错误,如本文底部所示。我没有使用这种方法来改变我自己创建的记录的EntityState,所以我不确定这是假设首先如何工作,但现在显然它不起作用。

也许它与在内存数据库中处理的事务有关?如果那就是问题,我不知道如何避免这种情况。

// PUT: api/Sessions/5
[HttpPut("{id}")]
public async Task<IActionResult> PutSessionRec([FromRoute] int id, [FromBody] SessionRec sessionRec)
{
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        if (id != sessionRec.Id)
        {
            return BadRequest();
        }

        _context.Entry(sessionRec).State = EntityState.Modified;

        try
        {
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException xx)
        {
            if (!SessionRecExists(id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return NoContent();
}

Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException:尝试更新或删除商店中不存在的实体。    在Microsoft.EntityFrameworkCore.Storage.Internal.InMemoryTable`1.Update(IUpdateEntry条目)    在Microsoft.EntityFrameworkCore.Storage.Internal.InMemoryStore.ExecuteTransaction

1 个答案:

答案 0 :(得分:0)

如果您将某个属性标记为时间戳并且未提供该属性,则每次都会收到此异常。您需要加载具有最新时间戳的实体并更新(不理想),或者您必须将时间戳发送到客户端并让客户端将其重新发送(正确方式)。但是,如果您使用的是旧版本的JSON序列化,则必须将byte []转换为base 64,然后将其转换回来。