繁体   English   中英

EF Core 异步 select InvalidOperationException

[英]EF Core async select InvalidOperationException

以下代码

var merchant = await _dbContext.Merchants
   .Include(m => m.Users)
   .SingleAsync(m => m.MerchantId == id);
 
var userTasks = merchant.Users.Select(async u =>
{
   var roles = await _userManager.GetRolesAsync(u);

   return new MerchantUser
   {
      UserName = u.UserName,
      Role = string.Join(",", roles)
   };
}).ToList();

var users = await Task.WhenAll(userTasks);
            
return View(new MerchantViewModel
{
   MerchantId = merchant.MerchantId,
   MerchantName = merchant.Name,
   MerchantUsers = users.ToList()
});

有时会返回此错误:

System.InvalidOperationException:在前一个操作完成之前在此上下文上启动了第二个操作。

但是,此代码没有。 据我了解,它正在做同样的事情,所以我不明白它为什么会失败。

var merchant = await _dbContext.Merchants
    .Include(m => m.Users)
    .SingleAsync(m => m.MerchantId == id);

var users = new List<MerchantUser>();
            
foreach (var user in merchant.Users)
{
    var roles = await _userManager.GetRolesAsync(user);
                
    users.Add(new MerchantUser
    {
        UserName = user.UserName,
        Role = string.Join(",", roles)
    });
}
            
return View(new MerchantViewModel
{
    MerchantId = merchant.MerchantId,
    MerchantName = merchant.Name,
    MerchantUsers = users
});
var userTasks = merchant.Users.Select(async u => { … }).ToList();
var users = await Task.WhenAll(userTasks);

这将同时异步启动所有这些Select任务,然后等待它们完成。 所以这将并行运行多个事情。 由于您正在查询内部的用户管理器,因此这将不起作用,因为底层连接不支持并行查询。

相反,您的foreach循环一次只运行一个查询,在下一次迭代开始之前等待GetRolesAsync 因此,不是并行工作,而是为所有用户按顺序读取角色。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM