首页 > 解决方案 > 在 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 或在角色循环之后,它没有任何区别。

标签: c#entity-frameworkasp.net-coreblazorblazor-server-side

解决方案


只是一个猜测:

IEnumerable_AvailibleRoles = _RoleManager.Roles.Select(x => x.Name).ToList();
IEnumerable_UserRoles = ... .ToList();

您似乎非常依赖 IEnumerable,请记住这意味着延迟执行。每次调用.Contains(...)它都会重新启动该查询。


推荐阅读