asp net core让用户异步失败

时间:2018-02-12 07:36:00

标签: c# asp.net-core

我有一个包含当前用户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()

我怎样才能解决这个问题?第一次点击是好的,但第二次没有。创建和编辑功能都会出现错误。

2 个答案:

答案 0 :(得分:1)

您应该使用等待关键字来调用它:

document.UpdatedBy = (await _userManager.GetUserAsync(HttpContext.User)).Id.ToString();

简单来说,当您在没有 async 关键字的情况下调用异步方法时,您的代码不会等待异步 GetUserAsync 方法完成。因此,当您调用下一个方法时它会继续运行,但您的数据尚未就绪。

https://docs.microsoft.com/en-us/dotnet/csharp/async

答案 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