MARS - 停止数据 reader 关闭的列表列表?
MARS - List of a list stopping data reader from closing?
我正在研究一个 ASP Core Identity 项目。
对于管理部分,要将用户添加到角色,我需要该角色的当前成员列表和非成员列表。然后我可以使用复选框或箭头按钮在它们之间移动用户。
我的代码出现错误:
**InvalidOperationException: There is already an open DataReader associated with this Connection which must be closed first.**
当我在数据库连接字符串中启用 MARS 时它起作用(我正在使用实体):
MultipleActiveResultSets=True
我的代码:
private RoleManager<IdentityRole> roleManager;
private UserManager<User> userManager;
public RoleController(RoleManager<IdentityRole> roleMgr, UserManager<User> userMrg)
{
// Constructor
// Role Manager, UserManager Dependancy Injection
roleManager = roleMgr;
userManager = userMrg;
}
public async Task<IActionResult> Update(string id)
{
IdentityRole role = await roleManager.FindByIdAsync(id);
List<User> members = new List<User>();
List<User> nonMembers = new List<User>();
foreach (User user in userManager.Users)
{
// We need MARS enabled in connection string
// MultipleActiveResultSets=True
// We are creating a list of a list and not closing the data reader?
var list = await userManager.IsInRoleAsync(user, role.Name) ? members : nonMembers;
list.Add(user);
}
return View(new RoleEdit
{
Role = role,
Members = members,
NonMembers = nonMembers
});
}
所以你会发送一个 id 到 Update() 模块
我的网站。com/controller/update/1
并查看如下列表:
我怎样才能重做这个,这样我就不必使用 MARS 了?有人告诉我这是一种解决方法,而不是使用它的解决方案。
感谢任何帮助。
谢谢 Zhi Lv,你在 foreach 参数中添加 .ToList() 的想法成功了。我的大部分其他代码保持不变。
public async Task<IActionResult> Update(string id)
{
IdentityRole role = await roleManager.FindByIdAsync(id);
List<User> members = new List<User>();
List<User> nonMembers = new List<User>();
// Add .ToList() here
foreach (User user in userManager.Users.ToList())
{
var list = await userManager.IsInRoleAsync(user, role.Name) ? members : nonMembers;
list.Add(user);
}
return View(new RoleEdit
{
Role = role,
Members = members,
NonMembers = nonMembers
});
}
我正在研究一个 ASP Core Identity 项目。
对于管理部分,要将用户添加到角色,我需要该角色的当前成员列表和非成员列表。然后我可以使用复选框或箭头按钮在它们之间移动用户。
我的代码出现错误:
**InvalidOperationException: There is already an open DataReader associated with this Connection which must be closed first.**
当我在数据库连接字符串中启用 MARS 时它起作用(我正在使用实体):
MultipleActiveResultSets=True
我的代码:
private RoleManager<IdentityRole> roleManager;
private UserManager<User> userManager;
public RoleController(RoleManager<IdentityRole> roleMgr, UserManager<User> userMrg)
{
// Constructor
// Role Manager, UserManager Dependancy Injection
roleManager = roleMgr;
userManager = userMrg;
}
public async Task<IActionResult> Update(string id)
{
IdentityRole role = await roleManager.FindByIdAsync(id);
List<User> members = new List<User>();
List<User> nonMembers = new List<User>();
foreach (User user in userManager.Users)
{
// We need MARS enabled in connection string
// MultipleActiveResultSets=True
// We are creating a list of a list and not closing the data reader?
var list = await userManager.IsInRoleAsync(user, role.Name) ? members : nonMembers;
list.Add(user);
}
return View(new RoleEdit
{
Role = role,
Members = members,
NonMembers = nonMembers
});
}
所以你会发送一个 id 到 Update() 模块
我的网站。com/controller/update/1
并查看如下列表:
我怎样才能重做这个,这样我就不必使用 MARS 了?有人告诉我这是一种解决方法,而不是使用它的解决方案。
感谢任何帮助。
谢谢 Zhi Lv,你在 foreach 参数中添加 .ToList() 的想法成功了。我的大部分其他代码保持不变。
public async Task<IActionResult> Update(string id)
{
IdentityRole role = await roleManager.FindByIdAsync(id);
List<User> members = new List<User>();
List<User> nonMembers = new List<User>();
// Add .ToList() here
foreach (User user in userManager.Users.ToList())
{
var list = await userManager.IsInRoleAsync(user, role.Name) ? members : nonMembers;
list.Add(user);
}
return View(new RoleEdit
{
Role = role,
Members = members,
NonMembers = nonMembers
});
}