简体   繁体   中英

Im getting InvalidOperationException when using UserManager.IsInRoleAsync()

Im trying to get all users in the role that I'm editing. But when I load the page it keeps giving me

InvalidOperationException: Cannot set MySqlCommand.CommandText when there is an open DataReader for this command; it must be closed first.

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

I'm getting the error here

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

The Users property is an IQueryable<User> , and it looks like it is keeping an open streaming query over the data while you iterate it, which is causing the problem if you try and execute a second operation.

As such, assuming the user directory isn't huge , you can probably work around this by simply:

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

which completes thew first query eagerly before iterating.


However! You probably want to look at GetUsersInRoleAsync instead :

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM