C# ASP.Net&;EF核心2和并发令牌错误
实体框架核心2,在模型中添加了一个并发令牌属性C# ASP.Net&;EF核心2和并发令牌错误,c#,entity-framework-core,asp.net-core-2.0,C#,Entity Framework Core,Asp.net Core 2.0,实体框架核心2,在模型中添加了一个并发令牌属性 [Timestamp] public byte[] Timestamp { get; set; } 控制器编辑失败 [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Edit(Guid id, [Bind("Id,Name,Description,IsDeleted,ParentId")] Ite
[Timestamp]
public byte[] Timestamp { get; set; }
控制器编辑失败
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(Guid id, [Bind("Id,Name,Description,IsDeleted,ParentId")] ItemStatus itemStatus)
{
if (id != itemStatus.Id)
return NotFound();
if (ModelState.IsValid)
{
try
{
_context.Update(itemStatus);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!ItemStatusExists(itemStatus.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
ViewData["ParentId"] = new SelectList(_context.ItemStatus, "Id", "Description", itemStatus.ParentId);
return View(itemStatus);
}
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务编辑(Guid id、[Bind(“id、名称、说明、IsDeleted、ParentId”)]ItemStatus ItemStatus)
{
if(id!=itemStatus.id)
返回NotFound();
if(ModelState.IsValid)
{
尝试
{
_更新(itemStatus);
wait_context.SaveChangesAsync();
}
catch(DbUpdateConcurrencyException)
{
如果(!itemStatus存在(itemStatus.Id))
{
返回NotFound();
}
其他的
{
投掷;
}
}
返回重定向到操作(名称(索引));
}
ViewData[“ParentId”]=新的选择列表(_context.ItemStatus,“Id”,“Description”,ItemStatus.ParentId);
返回视图(itemStatus);
}
我收到的特定错误发生在SaveChangesSync发生时。接住砰砰的一声,当我踩进去时,球就直接掷出去了
DbUpdateConcurrencyException:数据库操作预期会影响1
行,但实际影响了0行。数据可能已被修改或删除
已删除,因为已加载实体。看见
有关
理解和处理乐观并发异常
Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.ThrowAggregateUpdateConcurrencyException(int
commandIndex,int ExpectedRowsInfected,int rowsAffected)
搜索错误消息没有帮助。确实找到了这篇文章,但似乎没有帮助
如评论中所示,我缺少一个隐藏字段来“保存”视图中的时间戳 遵循以下示例: 为了清晰起见,我添加了修改后的编辑。我也不得不做一些类似于删除的事情。这需要添加到编辑视图
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务编辑(Guid id、[Bind(“id、名称、描述、父id、时间戳”)]ItemStatus ItemStatus)
{
if(id!=itemStatus.id)
返回NotFound();
if(ModelState.IsValid)
{
尝试
{
_更新(itemStatus);
wait_context.SaveChangesAsync();
}
catch(DbUpdateConcurrencyException)
{
如果(!itemStatus存在(itemStatus.Id))
{
返回NotFound();
}
其他的
{
投掷;
}
}
返回重定向到操作(名称(索引));
}
ViewData[“ParentId”]=新的选择列表(_context.ItemStatus,“Id”,“Description”,ItemStatus.ParentId);
返回视图(itemStatus);
}
如果未包含(绑定)传入的ItemStatus
对象的Timestamp
属性,您希望发生什么情况?这就是我所遵循的。它没有说任何关于“绑定”的内容。我错过了什么?因为主题是关于EF核心的。而您的方法是ASP核心控制器或其他东西的一部分。因此,EF Core并发令牌假定您已经读取了对象中的原始数据,然后修改了一些属性,然后尝试保存-令牌将用于确保在您读取数据后,其他用户不会修改数据。由于您的控制器似乎没有填充timestamp属性,它将为null,因此并发检查将失败。Ivan StoeV I编辑了标题和标记以包含asp.net corefix时间戳填充错误?
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(Guid id, [Bind("Id,Name,Description,ParentId,Timestamp")] ItemStatus itemStatus)
{
if (id != itemStatus.Id)
return NotFound();
if (ModelState.IsValid)
{
try
{
_context.Update(itemStatus);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!ItemStatusExists(itemStatus.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
ViewData["ParentId"] = new SelectList(_context.ItemStatus, "Id", "Description", itemStatus.ParentId);
return View(itemStatus);
}