Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 帮助解决';已经有一个与此命令关联的打开的DataReader,必须先关闭它';在ASP.NET Core 3.1应用程序中_C#_Asp.net_Asp.net Core_Entity Framework Core - Fatal编程技术网

C# 帮助解决';已经有一个与此命令关联的打开的DataReader,必须先关闭它';在ASP.NET Core 3.1应用程序中

C# 帮助解决';已经有一个与此命令关联的打开的DataReader,必须先关闭它';在ASP.NET Core 3.1应用程序中,c#,asp.net,asp.net-core,entity-framework-core,C#,Asp.net,Asp.net Core,Entity Framework Core,我需要帮助修复错误消息: 已存在与此命令关联的打开的DataReader,必须先关闭该命令 问题源于以下行: foreach (var user in _userManager.Users) { 我知道基本上,还有一个读卡器打开,另一个还没有关闭,但我不知道如何根据我的代码修复这个问题。我到处搜索类似的问题,有很多问题,一些建议不添加跟踪,另一些则返回.ToList。我有点不知所措,需要一些帮助 以下是我目前的代码: 控制器 角色管理器和用户管理器都被注入,在本例中,我使用自己的Applica

我需要帮助修复错误消息:

已存在与此命令关联的打开的DataReader,必须先关闭该命令

问题源于以下行:

foreach (var user in _userManager.Users) {
我知道基本上,还有一个读卡器打开,另一个还没有关闭,但我不知道如何根据我的代码修复这个问题。我到处搜索类似的问题,有很多问题,一些建议不添加跟踪,另一些则返回
.ToList
。我有点不知所措,需要一些帮助

以下是我目前的代码:

控制器

角色管理器和用户管理器都被注入,在本例中,我使用自己的ApplicationUser扩展了identity类。我的理解是,在注入时,使用
\uu
声明项将不应用跟踪,这可能是错误的

  private readonly RoleManager<IdentityRole> _roleManager;
  private readonly UserManager<ApplicationUser> _userManager;

  public AdministrationController(RoleManager<IdentityRole> roleManager,
         UserManager<ApplicationUser> userManager) 
  {
      _roleManager = roleManager;
      _userManager = userManager;
  }

[HttpGet]
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 EditRoleViewModel
    {
        Id = role.Id,
        RoleName = role.Name
    };
    foreach (var user in _userManager.Users) {
        if (await _userManager.IsInRoleAsync(user, role.Name))
        {
            model.Users.Add(user.UserName);
        }
     }
     return View(model);
 }
查看

@model EditRoleViewModel
@{ 
    ViewBag.Title = "Edit Role";
}
<h1>Edit Role</h1>

<form method="post" class="mt-3">
    <div class="form-group row">
        <label asp-for="Id" class="col-sm-2 col-form-label"></label>
        <div class="col-sm-10">
            <input asp-for="Id" disabled class="form-control" />
        </div>
    </div>
    <div class="form-group row">
        <label asp-for="RoleName" class="col-sm-2 col-form-label"></label>
        <div class="col-sm-10">
            <input asp-for="RoleName" class="form-control" />
            <span asp-validation-for="RoleName" class="text-danger"></span>
        </div>
    </div>

    <div asp-validation-summary="All" class="text-danger"></div>

    <div class="form-group row">
        <div class="col-sm-10">
            <button type="submit" class="btn btn-parimary">Update</button>
            <a asp-action="ListRoles" class="btn btn-danger">Cancel</a>
        </div>
    </div> 

    <hr />
    <div class="card">
        <div class="card-header">
            <h3>Users in this role</h3>
        </div>
        <div class="card-body">
            @if (Model.Users.Any())
            {
                foreach (var user in Model.Users)
                {
                    <h5 class="card-title">@user</h5>
                }
            }
            else { 
                <h5 class="card-title">None at the moment</h5>
            }
        </div>
        <div class="card-footer">
            <a href="#" class="btn btn-primary" style="width: auto">Add Users</a>
            <a href="#" class="btn btn-primary" style="width: auto">Remove Users</a>
        </div>
    </div>    
</form>
@model EditRoleViewModel
@{ 
ViewBag.Title=“编辑角色”;
}
编辑角色
更新

非常感谢您提供的任何帮助。

您似乎试图在循环中使用相同的
\u userManager
对象,该循环也使用该对象来迭代您的用户。我相信
UserManager
有一个开放的连接,它使用
DataReader
来查询用户列表

修改
foreach
循环以迭代已完成的用户列表,或者将用户列表分配给局部变量,然后迭代该变量。无论哪种方式,在迭代该结果集之前,都需要调用
\u userManager.Users.ToList()
。然后您应该能够从循环中访问
\u userManager

我相信有一种方法可以启用多个活动结果集,但在您的情况下,我认为没有必要这样做。此外,使用DbContext进行查询时,无跟踪仅适用于EF Core。“无跟踪”指示DbContext不跟踪其更改跟踪器中的实体,这在更新实体时可能会导致问题

foreach(userManager.Users.ToList()中的var user)
{
if(wait_userManager.IsInRoleAsync(user,role.Name))
{
model.Users.Add(user.UserName);
}
}
或者可以使用async方法并将其分配给变量

var userList=await\u userManager.Users.toListSync();
foreach(userList中的var用户)
{
if(wait_userManager.IsInRoleAsync(user,role.Name))
{
model.Users.Add(user.UserName);
}
}

我相信这是指LINQ查询中的延迟执行。如果您想更好地理解它,可以在文档中阅读。

您是否尝试将
foreach(在_userManager.Users中的var user)
更改为
foreach(在_userManager.Users.ToList()中的var user)
?我认为问题可能是您从已使用相同的
\u userManager
对象的
foreach
循环中调用
\u userManager
。尝试在循环之前将用户加载到列表中,然后为循环引用该列表
var-userList=\u userManager.Users.ToList()
然后
foreach(userList中的var-user)感谢您的回答和解释。在延期执行的情况下工作。
@model EditRoleViewModel
@{ 
    ViewBag.Title = "Edit Role";
}
<h1>Edit Role</h1>

<form method="post" class="mt-3">
    <div class="form-group row">
        <label asp-for="Id" class="col-sm-2 col-form-label"></label>
        <div class="col-sm-10">
            <input asp-for="Id" disabled class="form-control" />
        </div>
    </div>
    <div class="form-group row">
        <label asp-for="RoleName" class="col-sm-2 col-form-label"></label>
        <div class="col-sm-10">
            <input asp-for="RoleName" class="form-control" />
            <span asp-validation-for="RoleName" class="text-danger"></span>
        </div>
    </div>

    <div asp-validation-summary="All" class="text-danger"></div>

    <div class="form-group row">
        <div class="col-sm-10">
            <button type="submit" class="btn btn-parimary">Update</button>
            <a asp-action="ListRoles" class="btn btn-danger">Cancel</a>
        </div>
    </div> 

    <hr />
    <div class="card">
        <div class="card-header">
            <h3>Users in this role</h3>
        </div>
        <div class="card-body">
            @if (Model.Users.Any())
            {
                foreach (var user in Model.Users)
                {
                    <h5 class="card-title">@user</h5>
                }
            }
            else { 
                <h5 class="card-title">None at the moment</h5>
            }
        </div>
        <div class="card-footer">
            <a href="#" class="btn btn-primary" style="width: auto">Add Users</a>
            <a href="#" class="btn btn-primary" style="width: auto">Remove Users</a>
        </div>
    </div>    
</form>