ASP.NET Identity UserManager UpdateAsync删除角色

Jam*_*mer 10 c# asp.net-core asp.net-core-identity

我们的应用程序中有一个屏幕,允许管理员角色的成员编辑用户帐户详细信息.

最终,任何用户对象都将发送到服务器并使用以下方式进

await userManager.UpdateAsync(user);
Run Code Online (Sandbox Code Playgroud)

这正在按预期更新用户记录.我们可以对数据库进行持久更改,例如用户名,电话号码等.

我看到的问题是,有时更新角色而不是向用户添加其他角色时,它会删除所有角色.

在我们的ApplicationUser对象上,我们有这样的属性:

public virtual ICollection<IdentityUserRole<string>> Roles { get; set; } = new List<IdentityUserRole<string>>();
Run Code Online (Sandbox Code Playgroud)

因此,我们可以在客户端和服务器之间作为用户对象的一部分进行反弹.

我正在努力理解的是userManager.UpdateAsync(user);我所看到的方法的不一致行为.它显然有效,或者永远无法向用户添加任何角色.

到达服务器的对象每次提交时都会正确填充角色.基本流程是:

  1. 添加角色并提交
  2. 该角色正确添加到用户
  3. 添加其他角色并提交
  4. 所有角色都被删除

如何防止它删除角色?

谢谢!

UPDATE

正如@amirani的答案中详述的那样,我尝试过滤现有的列表.我已经设置AutoMapper完全忽略该属性.

.ForMember(x => x.Roles, opt => opt.Ignore());
Run Code Online (Sandbox Code Playgroud)

我现在只是像这样过滤(目前仅添加):

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 });
  }
}
Run Code Online (Sandbox Code Playgroud)

其他角色永远不会添加到基础数据库.我已经确认在执行UpdateUser方法之前,正在更新的用户对象具有正确的角色列表.

ami*_*ani 2

当您致电时,await userManager.UpdateAsync(user);您正在更新用户模型及其所有相关数据。您需要将新角色添加到现有角色列表中,而不是创建新的空列表并添加新记录。