C# Can';t从ASP.NET IdentityUserRole中提取具有角色的用户列表
我正在尝试获取具有共同响应角色的用户列表。使用IdentityUser、IdentityRole、IdentityUserRole。 我已经尝试了不同的方法,并遵循了StackOverflow的许多答案。 我的主要问题是,当我向用户和角色模型添加导航属性时,在UserRole表中会重复一些列 如果您需要更多信息,请告诉我 但我需要你的帮助 详情: 用户:C# Can';t从ASP.NET IdentityUserRole中提取具有角色的用户列表,c#,asp.net,asp.net-core,asp.net-web-api,asp.net-identity,C#,Asp.net,Asp.net Core,Asp.net Web Api,Asp.net Identity,我正在尝试获取具有共同响应角色的用户列表。使用IdentityUser、IdentityRole、IdentityUserRole。 我已经尝试了不同的方法,并遵循了StackOverflow的许多答案。 我的主要问题是,当我向用户和角色模型添加导航属性时,在UserRole表中会重复一些列 如果您需要更多信息,请告诉我 但我需要你的帮助 详情: 用户: 公共类用户:IdentityUser { 公共字符串{get;set;} 公共ICollection用户角色{get;set;} } 角色:
公共类用户:IdentityUser
{
公共字符串{get;set;}
公共ICollection用户角色{get;set;}
}
角色:
公共类角色:IdentityRole
{
公共ICollection用户角色{get;set;}
}
用户角色:
public class UserRole : IdentityUserRole<string>
{
public User User { get; set; }
public Role Role { get; set; }
}
public类用户角色:IdentityUserRole
{
公共用户{get;set;}
公共角色{get;set;}
}
DbContext:
public class DataContext : IdentityDbContext<User, Role, string, IdentityUserClaim<string>,
UserRole, IdentityUserLogin<string>, IdentityRoleClaim<string>, IdentityUserToken<string>>
{
public DataContext(DbContextOptions<DataContext> options) : base(options) {}
}
公共类DataContext:IdentityDbContext
{
公共DataContext(DbContextOptions选项):基本(选项){}
}
迁移和更新数据库后:
表格AspNetUserRoles:
ps:之前插入的数据
我很沮丧,请帮忙
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) {}
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();
});
}
}
公共类DataContext:IdentityDbContext
{
公共数据上下文(DbContextOptions)
:base(选项){}
模型创建时受保护的覆盖无效(ModelBuilder)
{
基于模型创建(生成器);
builder.Entity(b=>
{
b、 HasMany(u=>u.UserRoles)
.WithOne(ur=>ur.User)
.HasForeignKey(ur=>ur.UserId)
.IsRequired();
});
builder.Entity(b=>
{
b、 HasMany(r=>r.UserRoles)
.WithOne(ur=>ur.Role)
.HasForeignKey(ur=>ur.RoleId)
.IsRequired();
});
}
}
我还没有对此进行测试,但它应该替换默认配置,这样您就不会在UserRole
上出现重复的列,您的导航属性应该可以正常工作
public class UserRole : IdentityUserRole<string>
{
public User User { get; set; }
public Role Role { get; set; }
}
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();
});
}
}