gpt4 book ai didi

c# - ASP.NET Identity UserManager UpdateAsync 删除角色

转载 作者:可可西里 更新时间:2023-11-01 09:14:42 26 4
gpt4 key购买 nike

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

最终,任何用户对象都会被发送到服务器并使用以下方式进行更新:

await userManager.UpdateAsync(user);

这对于更新用户记录来说是按预期工作的。我们可以进行更改并保存到数据库中,例如用户名、电话号码等。

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

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

public virtual ICollection<IdentityUserRole<string>> Roles { get; set; } = new List<IdentityUserRole<string>>();

因此我们可以将角色作为用户对象的一部分在客户端和服务器之间反弹。

我很难理解的是我看到的 userManager.UpdateAsync(user); 方法的不一致行为。它显然有效,否则永远无法为用户添加任何角色。

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

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

如何防止它删除角色?

谢谢!

更新

正如@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 方法之前具有正确的角色列表。

最佳答案

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

关于c# - ASP.NET Identity UserManager UpdateAsync 删除角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51858165/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com