You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core中UserManager无法将用户角色保存至AspNetUserRoles表

问题:调用AddToRolesAsync后AspNetUserRoles表无数据

调试时await userManager.AddToRolesAsync()传入的user和roles均有有效数据,但数据库的AspNetUserRoles表始终没有生成用户角色关联数据,手动调用await context.SaveChanges()也无效。已确认aspnetroles表中存在所需角色。

相关代码

Startup.cs

services.AddDbContext<AuthDBContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

services.AddIdentity<User, IdentityRole>()
        .AddEntityFrameworkStores<AuthDBContext>()
        .AddDefaultTokenProviders();

DatabaseContext.cs

public class AuthDBContext : IdentityDbContext<User>
{
    public AuthDBContext(DbContextOptions<AuthDBContext> options) : base(options)
    {  }

    public DbSet<User> Users { get; set; }
    public DbSet<Building> Buildings { get; set; }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.ApplyConfiguration(new RoleConfig());           
    }
}

UserEntity.cs

public class User : IdentityUser
{
    public string Firstname { get; set; } 
    public string Lastname { get; set; }
}

UserService.cs

public async Task AddRoles(UserDto userDto)
{
    var roles = new List<string>();

    if (userDto.Roles == null)
    {
        roles.Add("User");   //Set Default Role if Null
    }
    else
    {
        foreach (var role in userDto.Roles)
        {
            roles.Add(role);
        }
    }

    var user = mapper.Map<User>(userDto);
    await userManager.AddToRolesAsync(user, roles);
}

问题原因与修复方案

核心问题

你在AddRoles方法中用mapper.Map<User>(userDto)创建了一个全新的User对象,这个对象并没有被Entity Framework的上下文跟踪。UserManager操作未被跟踪的实体时,无法将关联数据持久化到数据库。

修复代码

修改AddRoles方法,先从数据库获取已存在的、被EF跟踪的用户实例,再执行添加角色操作:

public async Task AddRoles(UserDto userDto)
{
    var roles = new List<string>();

    if (userDto.Roles == null)
    {
        roles.Add("User");   //Set Default Role if Null
    }
    else
    {
        foreach (var role in userDto.Roles)
        {
            roles.Add(role);
        }
    }

    // 从数据库获取被跟踪的用户实体(假设UserDto包含用户Id)
    var user = await userManager.FindByIdAsync(userDto.Id);
    if(user == null)
    {
        throw new ArgumentException("用户不存在");
    }
    await userManager.AddToRolesAsync(user, roles);
}

补充说明

  • UserManager的AddToRolesAsync方法内部会自动调用上下文的SaveChanges,无需手动调用。
  • 必须确保获取的用户是数据库中已存在的记录,否则无法创建关联关系。

内容的提问来源于stack exchange,提问作者Tipe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 01:00:18