获取用户及其角色.NET 8 Web 应用程序

问题描述 投票:0回答:1

我正在尝试获取来自特定公司的用户及其角色。

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 已在使用中

c# web-applications .net-8.0
1个回答
0
投票

但是这会返回错误

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集合,为什么不直接从中获取你需要的东西呢?所以,我认为,你可以摆脱它。

注意:如果您想了解更多信息,请参考此官方文档

© www.soinside.com 2019 - 2024. All rights reserved.