Entity framework ASP.NET Core 2控制器PUT方法与并发Core一起失败

Entity framework ASP.NET Core 2控制器PUT方法与并发Core一起失败,entity-framework,asp.net-core,entity-framework-core,Entity Framework,Asp.net Core,Entity Framework Core,我有一个ASP.NETCore2.0站点,它有一个直接从简单模型和简单上下文构建的脚手架控制器。我通过简单地检查GET方法中的记录数来播种数据,如果为0,则添加100条记录。GET正在检索记录,正如我反复期望的那样 我正在使用inmemory数据库提供程序 services.AddDbContext<MyDbContext> (opt => opt.UseInMemoryDatabase("CodeCampInMemoryDb")); services

我有一个ASP.NETCore2.0站点,它有一个直接从简单模型和简单上下文构建的脚手架控制器。我通过简单地检查GET方法中的记录数来播种数据,如果为0,则添加100条记录。GET正在检索记录,正如我反复期望的那样

我正在使用inmemory数据库提供程序

services.AddDbContext<MyDbContext>
            (opt => opt.UseInMemoryDatabase("CodeCampInMemoryDb"));
services.AddDbContext
(opt=>opt.UseInMemoryDatabase(“CodeCampInMemoryDb”);
当我使用已知存在于GET中的记录执行PUT时,会出现一个并发错误,如本文底部所示。我没有使用这种方法来更改我自己创建的记录的EntityState,因此我不确定这在最初是如何工作的,但显然现在它不起作用了

也许它与inmemory数据库上正在处理的事务有关?如果这是个问题,我不知道如何避免

// 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();
}
//PUT:api/Sessions/5
[HttpPut(“{id}”)]
公共异步任务PutSessionRec([FromRoute]int id,[FromBody]SessionRec SessionRec)
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
if(id!=sessionRec.id)
{
返回请求();
}
_context.Entry(sessionRec.State=EntityState.Modified;
尝试
{
wait_context.SaveChangesAsync();
}
捕获(DbUpdateConcurrencyException xx)
{
如果(!SessionRecExists(id))
{
返回NotFound();
}
其他的
{
投掷;
}
}
返回NoContent();
}
Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException:尝试更新或删除存储中不存在的实体。 位于Microsoft.EntityFrameworkCore.Storage.Internal.InMemoryTable`1.Update(IUUpdate条目)
在Microsoft.EntityFrameworkCore.Storage.Internal.InMemoryStore.ExecuteTransaction

中,如果将属性标记为时间戳而不提供,则每次都会出现此异常。您要么需要加载具有最新时间戳的实体并更新该时间戳(不理想),要么必须将时间戳向下发送到客户端,并让客户端将其备份(正确的方式)。但是,如果您使用的是较旧版本的JSON序列化,则必须将字节[]转换为base 64,然后再将其转换回。

在将实体标记为已修改之前,您尚未将其从数据库检索到DbContext。这是一种现成的脚手架。你是说微软搞错了吗?什么才是正确的?错过了被搭建的那一点。如果它不能开箱即用,那么,是的,微软确实弄错了。使用实体作为操作参数是错误的。
SessionRec
处理请求中未填充的并发时是否有属性?