我刚开始玩blazor。
我第一次尝试使用用户管理系统,并尝试将用户角色更新为ListBox中选定的角色。
所有工作都很好,直到它到达以下循环:
// 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);
}
}
第一次尝试将用户添加到角色时出现错误。
不允许新事务,因为会话中有其他线程在运行。StackTrace
在角色更新循环之前,我只找到用户,更改其参数并保存。
// 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(...)
时,它都会重新启动该查询。