使用 UserManager.IsInRoleAsync() 时出现 InvalidOperationException
Im getting InvalidOperationException when using UserManager.IsInRoleAsync()
我正在尝试让所有用户担任我正在编辑的角色。但是当我加载页面时,它一直给我
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);
}
我在这里遇到错误
var userInRole = await userManager.IsInRoleAsync(user, role.Name);
Users
属性 是一个 IQueryable<User>
,它 看起来 就像在您对数据进行开放式流式查询时迭代它,如果您尝试执行第二个操作,这会导致问题。
因此,假设用户目录不是很大,您可以简单地解决这个问题:
foreach(var user in userManager.Users.ToList())
{...}
它在迭代之前急切地完成了第一个查询。
但是!您可能想看看 GetUsersInRoleAsync
而不是 :
foreach (var user in userManager.GetUsersInRoleAsync(role.Name))
{
model.Users.Add(user.UserName);
}
我正在尝试让所有用户担任我正在编辑的角色。但是当我加载页面时,它一直给我
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);
}
我在这里遇到错误
var userInRole = await userManager.IsInRoleAsync(user, role.Name);
Users
属性 是一个 IQueryable<User>
,它 看起来 就像在您对数据进行开放式流式查询时迭代它,如果您尝试执行第二个操作,这会导致问题。
因此,假设用户目录不是很大,您可以简单地解决这个问题:
foreach(var user in userManager.Users.ToList())
{...}
它在迭代之前急切地完成了第一个查询。
但是!您可能想看看 GetUsersInRoleAsync
而不是 :
foreach (var user in userManager.GetUsersInRoleAsync(role.Name))
{
model.Users.Add(user.UserName);
}