首页 > 解决方案 > 使用 UserManager.IsInRoleAsync() 时出现 InvalidOperationException

问题描述

我试图让所有用户担任我正在编辑的角色。但是当我加载页面时它一直给我

InvalidOperationException:当此命令有打开的 DataReader 时,无法设置 MySqlCommand.CommandText;它必须先关闭。

public async Task<IActionResult> EditRole(string id)
{
    var role = await roleManager.FindByIdAsync(id);
    if(role == null)
     {
        ViewBag.ErrorMessage = $"Role with id = {id} cannot be found";
        return View("NotFound");
    }
    var model = new EditRoleModel
    {
        Id = role.Id,
        RoleName = role.Name
    };
    foreach(var user in userManager.Users)
    {
        var userInRole = await userManager.IsInRoleAsync(user, role.Name);
        if (userInRole)
        {
            model.Users.Add(user.UserName);
        }
    }
    return View(model);
}

我在这里收到错误

var userInRole = await userManager.IsInRoleAsync(user, role.Name);

标签: c#asp.net-coreasp.net-core-identity

解决方案


Users属性是IQueryable<User>,并且看起来它在您迭代它时对数据保持开放的流式查询,如果您尝试执行第二个操作,这会导致问题。

因此,假设用户目录不是很大,您可以简单地解决这个问题:

foreach(var user in userManager.Users.ToList())
{...}

它在迭代之前急切地完成了第一个查询。


然而!你可能想看看GetUsersInRoleAsync

foreach (var user in userManager.GetUsersInRoleAsync(role.Name))
{
    model.Users.Add(user.UserName);
}

推荐阅读