我有一个包含当前用户ID的模型,每次创建/编辑用户后都包含其ID
型号代码:
public class Document
{
public int Id { get; set; }
[Required, StringLength(2)]
public string DocumentCode { get; set; }
public string DocumentName { get; set; }
public DateTime DateUpdated { get; set; } = DateTime.Now;
//Id of the current logged user
public string UpdatedBy { get; set; }
}
控制器代码:
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("Id,DocumentCode,DocumentName")] Document document)
{
if (id != document.Id)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
document.UpdatedBy = _userManager.GetUserAsync(HttpContext.User).Id.ToString();
_context.Update(document);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!DocumentExists(document.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(document);
}
编辑两次以上后出错。
InvalidOperationException:对此启动了第二个操作 上一次操作完成前的上下文。任何实例成员 不保证是线程安全的。
Microsoft.EntityFrameworkCore.Internal.ConcurrencyDetector.EnterCriticalSection()
我怎样才能解决这个问题?第一次点击是好的,但第二次没有。创建和编辑功能都会出现错误。
答案 0 :(得分:1)
您应该使用等待关键字来调用它:
document.UpdatedBy = (await _userManager.GetUserAsync(HttpContext.User)).Id.ToString();
简单来说,当您在没有 async 关键字的情况下调用异步方法时,您的代码不会等待异步 GetUserAsync 方法完成。因此,当您调用下一个方法时它会继续运行,但您的数据尚未就绪。
答案 1 :(得分:1)
假设Task<User>
返回document.UpdatedBy = await (_userManager.GetUserAsync(HttpContext.User)).Id.ToString();
个对象,那么应该先等待它。然后访问其属性。
document.UpdatedBy = await (_userManager.GetUserAsync(HttpContext.User))?.Id.ToString() ?? string.empty;
最好在这里检查null。
selectinput