无法从 ASP.NET IdentityUserRole 中提取具有角色的用户列表

Can't Extract Users List With Roles From ASP.NET IdentityUserRole

我正在尝试获取用户列表及其对应的角色。使用 IdentityUser、IdentityRole、IdentityUserRole。 我已经尝试过不同的方式并遵循了 Whosebug 的许多答案。 我遇到的主要问题是,当我将 Navigation 属性 添加到 User 和 Role 模型时,然后在 UserRole table 中复制一些列。

如果您需要更多信息,请告诉我

但是我需要你的帮助。

详情: 用户:

    public class User : IdentityUser
    {
        public string Gender { get; set; }
        public ICollection<UserRole> UserRoles { get; set; }
    }

角色:

    public class Role : IdentityRole<string>
    {
        public ICollection<UserRole> UserRoles { get; set; }
    }

用户角色:

    public class UserRole : IdentityUserRole<string>
    {
        public User User { get; set; }
        public Role Role { get; set; }
    }

数据库上下文:

    public class DataContext : IdentityDbContext<User, Role, string,  IdentityUserClaim<string>,
    UserRole, IdentityUserLogin<string>, IdentityRoleClaim<string>, IdentityUserToken<string>>
    {
        public DataContext(DbContextOptions<DataContext> options) : base(options) {}

    }

迁移和更新数据库后: Table AspNetUserRoles:

ps: 之前插入的那些数据。

我很沮丧,请帮助

public class UserRole : IdentityUserRole<string>
{
    public User User { get; set; }
    public Role Role { get; set; }
}

基本类型 IdentityUserRole<> 已经有一个 UserId 和一个 RoleId。通过为 UserRole 添加新属性, 而无需 配置上下文来说明这些属性,您实质上是将新属性引入 table ( UserId1RoleId1) 从未填充。

您应该可以通过重新配置上下文来解决此问题。 default configuration 看起来像这样:

builder.Entity<TUser>(b =>
{
    b.HasMany<TUserRole>().WithOne().HasForeignKey(ur => ur.UserId).IsRequired();
});

builder.Entity<TRole>(b =>
{
    b.HasMany<TUserRole>().WithOne().HasForeignKey(ur => ur.RoleId).IsRequired();
});

因此,如果您覆盖这些关系配置,您应该能够使您的导航属性正常工作:

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)
    {
        base.OnModelCreating(builder);

        builder.Entity<User>(b =>
        {
            b.HasMany<UserRole>(u => u.UserRoles)
                .WithOne(ur => ur.User)
                .HasForeignKey(ur => ur.UserId)
                .IsRequired();
        });

        builder.Entity<Role>(b =>
        {
            b.HasMany<UserRole>(r => r.UserRoles)
                .WithOne(ur => ur.Role)
                .HasForeignKey(ur => ur.RoleId)
                .IsRequired();
        });
    }
}

我还没有对此进行测试,但它应该会替换默认配置,这样你就不会在 UserRole 上出现重复的列,这样你的导航属性就可以正常工作了。