我正在尝试获取来自特定公司的用户及其角色。
public IndexModel( UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
public async Task<IActionResult> OnGet()
{
ApplicationUser user = await _userManager.GetUserAsync(User);
ValidatePermission Validate = new ValidatePermission(_context, _userManager);
if (!await Validate.validateAdmin(user))
{
return RedirectToPage("/InvalidPermissions");
}
var roles = await _userManager.GetRolesAsync(user);
var users = _userManager.Users.Where(u => u.Company_ID == user.Company_ID).Where(u => u.Id != user.Id);
Users = new List<CompanyUserViewModel>();
foreach (var companyUser in users)
{
var tempUser = await _userManager.FindByIdAsync(companyUser.Id);
var userRoles = await _userManager.GetRolesAsync(tempUser);
CompanyUserViewModel userView = new CompanyUserViewModel();
userView.ID = companyUser.Id;
userView.Name = companyUser.FirstName + " " + companyUser.LastName;
userView.Role = userRoles.Contains("Admin") ? "Admin" : userRoles.Contains("Manager") ? "Manager" : "User";
userView.JobTitle = companyUser.JobTitle;
userView.Email = companyUser.Email;
Users.Add(userView);
}
return Page();
}
但是这会返回错误
InvalidOperationException:此 MySqlConnection 已在使用中
但是这会返回错误
InvalidOperationException:此 MySqlConnection 已在使用中
根据您的代码和错误消息,表明多个操作试图一起使用连接池,而前一个连接尚未释放。
当您尝试使用已被其他操作使用的 MySqlConnection 对象时,通常会发生此错误。在 ASP.NET Core 应用程序中,Entity Framework Core 管理连接池,因此您通常不需要手动管理连接。
因此,在夏季,您正在尝试在单个连接上执行多个数据检索命令。当您迭代查询(IQueryable)的结果时,可能会发生这种情况,并且您将在迭代内触发已加载实体的延迟加载。
让我们调查您的代码,以便查明问题。不过,如果您能以某种方式共享您的代码,以便我们可以重现,那就更好了。然而,很难确切地说出是什么原因导致了这个问题。
你的方法似乎是异步的,所以乍一看,我可以看到,你得到了
users
并且没有指定它的类型,你直接执行循环。请参阅以下行:
var users = _userManager.Users.Where(u => u.Company_ID == user.Company_ID).Where(u => u.Id != user.Id);
但是要执行循环,您必须先填充列表。所以你的池仍然在那里工作。
您不应该这样做,而应该使用填充异步用户列表。 您可以执行以下操作:
var users = await _userManager.Users.Where(u => u.Company_ID == user.Company_ID && u.Id != user.Id).ToListAsync();
因此,如果您使用
ToListAsync()
,您之前的操作只会释放连接并打开新的执行。
另一个问题是您的 DbContext。我可以看到您正在使用
_context
,但尚未显示或澄清。如果您从某个地方使用上下文,那么检查连接是否在那里部署很重要。但通过构造函数注入连接总是明智的。因此,您可以通过构造函数初始化 DbContext,如下所示:
private readonly UserManager<ApplicationUser> _userManager;
private readonly ApplicationDbContext _context;
public IndexModel(UserManager<ApplicationUser> userManager, ApplicationDbContext context)
{
_userManager = userManager;
_context = context;
}
此外,我没有看到以下调用有任何用途:
var tempUser = await _userManager.FindByIdAsync(companyUser.Id);
既然你有companyUser集合,为什么不直接从中获取你需要的东西呢?所以,我认为,你可以摆脱它。
注意:如果您想了解更多信息,请参考此官方文档。