C# ASP.Net&;EF核心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

实体框架核心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);
        }
[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);
        }