Bây giờ tôi đã triển khai giải pháp sau.
Như CodeNotFound đã chỉ ra trong các nhận xét, IdentityUser từng có Roles
bất động sản. Điều này không còn xảy ra trong .NET Core. nhận xét / sự cố
này trên GitHub dường như là giải pháp hiện tại cho .Net Core. Tôi đã cố gắng triển khai nó bằng mã sau:
Người dùng ứng dụng
public class ApplicationUser : IdentityUser
{
public ICollection<ApplicationUserRole> UserRoles { get; set; }
}
ApplicationUserRole
public class ApplicationUserRole : IdentityUserRole<string>
{
public virtual ApplicationUser User { get; set; }
public virtual ApplicationRole Role { get; set; }
}
ApplicationRole
public class ApplicationRole : IdentityRole
{
public ICollection<ApplicationUserRole> UserRoles { get; set; }
}
DBContext
public class ApplicationDbContext
: IdentityDbContext<ApplicationUser, ApplicationRole, string, IdentityUserClaim<string>,
ApplicationUserRole, IdentityUserLogin<string>,
IdentityRoleClaim<string>, IdentityUserToken<string>>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<ApplicationUserRole>(userRole =>
{
userRole.HasKey(ur => new { ur.UserId, ur.RoleId });
userRole.HasOne(ur => ur.Role)
.WithMany(r => r.UserRoles)
.HasForeignKey(ur => ur.RoleId)
.IsRequired();
userRole.HasOne(ur => ur.User)
.WithMany(r => r.UserRoles)
.HasForeignKey(ur => ur.UserId)
.IsRequired();
});
}
}
Khởi động
services.AddIdentity<ApplicationUser, ApplicationRole>(options => options.Stores.MaxLengthForKeys = 128)
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
Cuối cùng, hãy đảm bảo rằng khi bạn đang sử dụng nó, bạn háo hức tải UserRoles của người dùng và sau đó là UserRole của Role như sau:
this.Users = userManager.Users.Include(u => u.UserRoles).ThenInclude(ur => ur.Role).ToList();
Tôi gặp sự cố trong đó Roles
thuộc tính của mỗi UserRole
là null và điều này đã được giải quyết bằng cách thêm vào .ThenInclude(ur => ur.Role)
một phần.
Tài liệu Microsoft khi tải háo hức nhiều cấp: https://docs.microsoft.com/en-us/ef/core/querying/osystem-data#including-multiple-levels
Bản cập nhật ASP Core 2.2
Kế thừa từ IdentityUserRole<Guid>
Không phải chuỗi Bạn cũng có thể cần xóa mã trong ModelBuilder để việc di chuyển hoạt động.