无法从 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
。通过为 User
和 Role
添加新属性, 而无需 配置上下文来说明这些属性,您实质上是将新属性引入 table ( UserId1
和 RoleId1
) 从未填充。
您应该可以通过重新配置上下文来解决此问题。 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
上出现重复的列,这样你的导航属性就可以正常工作了。
我正在尝试获取用户列表及其对应的角色。使用 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
。通过为 User
和 Role
添加新属性, 而无需 配置上下文来说明这些属性,您实质上是将新属性引入 table ( UserId1
和 RoleId1
) 从未填充。
您应该可以通过重新配置上下文来解决此问题。 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
上出现重复的列,这样你的导航属性就可以正常工作了。