无法从ASP.NET IdentityUserRole提取带角色的用户列表求助
解决Identity自定义UserRole后AspNetUserRoles表出现重复列的问题
我明白你现在的困扰——在自定义Identity的User、Role和UserRole模型并添加导航属性后,AspNetUserRoles表出现了重复的外键列。这其实是EF Core自动推断关联关系时,和Identity默认的表结构配置冲突导致的,咱们来一步步解决:
问题根源
默认的IdentityUserRole<TKey>已经定义了UserId和RoleId这两个外键字段。当你在自定义的UserRole类中添加User和Role导航属性后,如果没有显式指定外键映射,EF Core会自动生成额外的外键列(比如UserId1、RoleId1),这就造成了表结构的重复。
解决方案:显式配置外键关系
你需要在DbContext的OnModelCreating方法中,手动指定导航属性对应的外键,让EF Core使用Identity默认的UserId和RoleId字段,而不是生成新列。修改后的代码如下:
1. 更新DataContext类
public class DataContext : IdentityDbContext<User, Role, string, IdentityUserClaim<string>, UserRole, IdentityUserLogin<string>, IdentityRoleClaim<string>, IdentityUserToken<string>> { public DataContext(DbContextOptions<DataContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder builder) { // 先调用Identity的基础配置,不要省略这一步 base.OnModelCreating(builder); // 配置UserRole与User的关联,指定外键为UserId builder.Entity<UserRole>() .HasOne(ur => ur.User) .WithMany(u => u.UserRoles) .HasForeignKey(ur => ur.UserId) .IsRequired(); // 配置UserRole与Role的关联,指定外键为RoleId builder.Entity<UserRole>() .HasOne(ur => ur.Role) .WithMany(r => r.UserRoles) .HasForeignKey(ur => ur.RoleId) .IsRequired(); } }
2. 修复数据库迁移
因为之前的迁移已经生成了错误的重复列,需要根据你的环境情况处理:
- 开发环境(无重要数据):
- 移除之前的错误迁移:
dotnet ef migrations remove - 生成新的正确迁移:
dotnet ef migrations add FixUserRoleDuplicateColumns - 更新数据库:
dotnet ef database update
- 移除之前的错误迁移:
- 生产环境(已有数据):
不要直接移除旧迁移,而是生成新的迁移来删除重复的列。执行dotnet ef migrations add RemoveDuplicateUserRoleColumns,然后检查生成的迁移文件,确保是删除多余的UserId1/RoleId1列,再执行dotnet ef database update。
这样配置后,EF Core就会使用Identity默认的UserId和RoleId作为导航属性的外键,不会再生成重复列,同时你也能正常使用导航属性来关联用户和角色。
内容的提问来源于stack exchange,提问作者Bin Rohan
相关产品推荐
相关产品推荐

