【问题标题】:Im getting InvalidOperationException when using UserManager.IsInRoleAsync()使用 UserManager.IsInRoleAsync() 时出现 InvalidOperationException
【发布时间】:2020-03-29 10:03:19
【问题描述】:

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

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

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);

【问题讨论】:

  • 您需要在连接数据库的位置显示代码。
  • 很抱歉,这就是所有的代码。我正在使用 asp.net-core-identity 用户管理器。而且它不显示数据库连接。

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


【解决方案1】:

Users 属性是一个IQueryable&lt;User&gt;,它看起来在您迭代数据时会保持对数据的开放式流式查询,如果您尝试执行,则会导致问题第二次操作。

因此,假设用户目录不是很大,您可以通过以下方式解决这个问题:

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

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


但是!你可能想看看GetUsersInRoleAsync 而不是

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多