Entity Framework Core 2,为模型添加了并发令牌属性
[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);
}
发生SaveChangesAsync时发生我收到的特定错误。抓住流行音乐,当我踏入它时直接进入投掷。
DbUpdateConcurrencyException:数据库操作预计会影响1 行但实际上影响了0行。数据可能已被修改或 自实体加载后删除。看到 http://go.microsoft.com/fwlink/?LinkId=527962了解有关的信息 理解和处理乐观并发异常。
Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.ThrowAggregateUpdateConcurrencyException(INT commandIndex,int expectedRowsAffected,int rowsAffected)
搜索错误消息并没有帮助。确实找到了这篇文章,但似乎没有任何帮助。
答案 0 :(得分:2)
如评论中所示,我错过了一个隐藏的字段来“保存”#39;视图中的时间戳。
遵循此示例:https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/concurrency
为了清晰起见,添加了我改变的编辑。我也必须做类似删除的事情。这需要添加到编辑视图<input type="hidden" asp-for="Timestamp" />
[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);
}