C# EF核心异步选择无效操作异常

C# EF核心异步选择无效操作异常,c#,asp.net-core,entity-framework-core,C#,Asp.net Core,Entity Framework Core,下面的代码 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 Merch

下面的代码

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-merchant=await\u dbContext.Merchants
.Include(m=>m.Users)
.SingleAsync(m=>m.MerchantId==id);
var users=新列表();
foreach(商户用户中的var用户)
{
var roles=await\u userManager.GetRolesAsync(用户);
用户。添加(新跟单员)
{
UserName=user.UserName,
Role=string.Join(“,”个角色)
});
}
返回视图(新商品视图模型)
{
MerchantId=merchant.MerchantId,
MerchantName=商户名称,
商家=用户
});
var userTasks=merchant.Users.Select(async u=>{…}).ToList();
var users=wait Task.WhenAll(userTasks);
这将同时异步启动所有
选择的
任务,然后等待它们完成。因此,这将并行运行多个任务。由于您正在查询内部的用户管理器,这将不起作用,因为基础连接不支持并行查询


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

一个相同的
DbContext
无法执行两个异步查询,如果需要同时查询多个查询,则需要多个DbContext(或连接,如果直接执行查询)。请将您的问题包含为的完整源代码,其他人可以编译和测试。我觉得EF接受异步lambda函数作为LINQ谓词/函数很奇怪。这可以在运行时捕获吗?好吧,这总是会失败,对吧?这与EF无关,
merchant.Users
是您第一次查询中以前加载的用户的内存列表。然后运行LINQ的
Select
,它只会在每个元素上应用一个函数。只是在您的特殊情况下,您在这些函数中运行一个数据库操作,并与
任务并行运行一切但是,是的,这种情况很可能永远失败。使用
Task.whalll
和触发数据库操作的(惰性)可枚举任务是个坏主意。