sql >> データベース >  >> RDS >> Mysql

.NET Core 2.1 Identityは、関連する役割を持つすべてのユーザーを取得します

    これで、次のソリューションを実装しました。

    CodeNotFoundがコメントで指摘しているように、IdentityUserにはRolesがありました。 財産。これは、.NETCoreには当てはまりません。このコメント/問題 GitHubのは、.NetCoreの現在のソリューションのようです。次のコードで実装しようとしました:

    ApplicationUser

    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();
            });
        }
    }
    

    スタートアップ

    services.AddIdentity<ApplicationUser, ApplicationRole>(options => options.Stores.MaxLengthForKeys = 128)
                .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddDefaultTokenProviders();
    

    最後に、それを使用するときは、ユーザーのUserRolesを熱心にロードしてから、次のようにUserRoleのロールをロードするようにしてください。

    this.Users = userManager.Users.Include(u => u.UserRoles).ThenInclude(ur => ur.Role).ToList();
    

    Roleで問題が発生しました 各UserRoleのプロパティ nullであり、これは.ThenInclude(ur => ur.Role)を追加することで解決されました 一部。

    マルチレベルの積極的な読み込みに関するMicrosoftドキュメント: https://docs.microsoft.com/en-us/ef/core/querying/related-data#include-multiple-levels

    ASPCore2.2アップデート

    IdentityUserRole<Guid>から継承 文字列ではありません移行を機能させるには、ModelBuilderのコードを削除する必要がある場合もあります。



    1. SQLServerでUPDATEパススルークエリを実行する方法

    2. SQLite JSON_TYPE()

    3. 主キーにOracleのSYS_GUID()を使用するようにHibernateを構成します

    4. string_agg()からの結果をソートする方法