c# - 在 UserManager.AddToRoleAsync 上:“不允许新事务,因为会话中正在运行其他线程。”
问题描述
我刚开始玩 blazor。
我在用户管理系统上进行了第一次尝试,并尝试将用户角色更新为列表框中的选定角色。
一切正常,直到它到达以下循环:
// On Initialisation
IEnumerable_AvailibleRoles = _RoleManager.Roles.Select(x => x.Name);
// On Save
foreach (string sIdentityRoleName in IEnumerable_AvailibleRoles)
{
bool bUserIsInRole = await _UserManager.IsInRoleAsync(IdentityUser_User, sIdentityRoleName);
if (bUserIsInRole && !IEnumerable_UserRoles.Contains(sIdentityRoleName))
{
// Remove user from role
await _UserManager.RemoveFromRoleAsync(IdentityUser_User, sIdentityRoleName);
}
if (!bUserIsInRole && IEnumerable_UserRoles.Contains(sIdentityRoleName))
{
// Put user in role
await _UserManager.AddToRoleAsync(IdentityUser_User, sIdentityRoleName);
}
}
首次尝试将用户添加到角色时会出现该错误。
不允许新事务,因为会话中还有其他线程在运行。堆栈跟踪
Bevor角色更新循环我只是找到用户,更改它的参数并保存它。
// Get the user
IdentityUser_User = await _UserManager.FindByIdAsync(this.IdentityUser_User.Id);
// Update Email
IdentityUser_User.Email = this.IdentityUser_User.Email;
// Update the user
await _UserManager.UpdateAsync(IdentityUser_User);
但是,如果我保存用户 bevor 或在角色循环之后,它没有任何区别。
解决方案
只是一个猜测:
IEnumerable_AvailibleRoles = _RoleManager.Roles.Select(x => x.Name).ToList();
IEnumerable_UserRoles = ... .ToList();
您似乎非常依赖 IEnumerable,请记住这意味着延迟执行。每次调用.Contains(...)
它都会重新启动该查询。
推荐阅读
- php - wp_list_pages 结果的分页
- javascript - 当我将新元素添加到顶部时,如何将位置保持在可滚动列表中?
- android - 如何添加android studio离线组件
- angular - primeNG V9 表格数据不会以角度 9 保留在屏幕上
- python - 将 CATEGORY_CHOICES 与多于一级的子选项分组?
- go - Go mod private repo 在 cloudbuild 中读取错误的路径
- python - 以新的表/数据框格式有效地将 spark 数据框列转置/分解为行 [pyspark]
- java - 退出while循环在java中不起作用
- python - 用另一个词替换一个词的每个实例,而不会破坏包含该词的其他词
- dataframe - 如何在 Pyspark 中设置 KryoSerializer?