c# - 使用 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);
解决方案
该Users
属性是IQueryable<User>
,并且看起来它在您迭代它时对数据保持开放的流式查询,如果您尝试执行第二个操作,这会导致问题。
因此,假设用户目录不是很大,您可以简单地解决这个问题:
foreach(var user in userManager.Users.ToList())
{...}
它在迭代之前急切地完成了第一个查询。
然而!你可能想看看:GetUsersInRoleAsync
foreach (var user in userManager.GetUsersInRoleAsync(role.Name))
{
model.Users.Add(user.UserName);
}
推荐阅读
- python - 解决使用 Gensim LDA Multicore 时的内存问题
- c# - C#如何将方法传递给基本的WinForm按钮单击事件
- reactjs - useEffect 在第一次 useState 的集合在计时器内过时后停止工作
- python-sphinx - 在为带有按钮或选项卡的页面加载不同的 URL 时,如何让 Sphinx 目录树运行?
- asp.net-mvc - Microsoft Edge 中的输入字段不显示数据
- visual-studio - 连接 DP 时出错:无法读取 IDR-无法建立连接,因为目标机器主动拒绝它
- python - Fill in missing date values within a dataframe
- sql - SQL:在地图中创建地图
- arrays - 如果已存在,则阻止将 pscustomobject 添加到数组
- java - Android MediaPlayer 在后台播放 1 分钟后停止