【发布时间】:2018-08-15 11:51:45
【问题描述】:
我们的应用程序中有一个屏幕允许管理员角色的成员编辑用户帐户详细信息。
最终,任何用户对象都会发送到服务器并使用以下方式更新:
await userManager.UpdateAsync(user);
这在更新用户记录时按预期工作。我们可以进行持久化到数据库的更改,例如用户名、电话号码等。
我看到的问题是,有时更新角色而不是向用户添加其他角色时,它会删除所有角色。
在我们的 ApplicationUser 对象上,我们有这样的属性:
public virtual ICollection<IdentityUserRole<string>> Roles { get; set; } = new List<IdentityUserRole<string>>();
因此,我们可以将客户端和服务器之间的角色作为用户对象的一部分反弹。
我正在努力理解的是我看到的 userManager.UpdateAsync(user); 方法的不一致行为。它显然有效,否则永远无法向用户添加任何角色。
每次提交时,到达服务器的对象都会正确填充角色。基本流程是:
- 添加角色并提交
- 角色已正确添加到用户
- 添加其他角色并提交
- 所有角色均已删除
如何防止它删除角色?
谢谢!
更新
正如@amirani 的回答中所详述的那样,我尝试过滤现有列表。我已经设置 AutoMapper 完全忽略该属性。
.ForMember(x => x.Roles, opt => opt.Ignore());
我现在只是像这样过滤(目前只添加):
foreach (var userDtoRole in userDto.Roles)
{
if (user.Roles.FirstOrDefault(x => x.RoleId == userDtoRole) == null)
{
user.Roles.Add(new IdentityUserRole<string> {RoleId = userDtoRole, UserId = user.Id });
}
}
其他角色永远不会添加到基础数据库中。在执行 UpdateUser 方法之前,我已经确认正在更新的用户对象具有正确的角色列表。
【问题讨论】:
-
查看我的答案并与我们分享如何使用这些代码重现您的问题。
标签: c# asp.net-core asp.net-core-identity