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
相关产品推荐
相关产品推荐

