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