Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

.NET Core 2.1 Identity nhận tất cả người dùng với các vai trò liên quan của họ

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Trình kích hoạt MySQL có thể mô phỏng ràng buộc KIỂM TRA không?

  2. CHÈN VÀO ... CHỌN cho tất cả các cột MySQL

  3. Cách tạo và triển khai cơ sở dữ liệu Azure cho MySQL Server bằng Azure Portal và Workbench

  4. Tôi có thể thực thi nhiều truy vấn được phân tách bằng dấu chấm phẩy với MySQL Connector / J không?

  5. Thư viện không được tải:lỗi libmysqlclient.16.dylib khi cố gắng chạy 'máy chủ rails' trên OS X 10.6 với đá quý mysql2