C# 帮助解决';已经有一个与此命令关联的打开的DataReader,必须先关闭它';在ASP.NET Core 3.1应用程序中
我需要帮助修复错误消息: 已存在与此命令关联的打开的DataReader,必须先关闭该命令 问题源于以下行: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
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>