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
和触发数据库操作的(惰性)可枚举任务是个坏主意。