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