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

EF Core2.0Identity-ナビゲーションプロパティの追加

    理由はわかりませんが、これらの便利なナビゲーションプロパティはありません。ユーザーとその役割を一覧表示したい。

    だから私は次のことをしました:

    public class ApplicationUser : IdentityUser
    {
        public virtual ICollection<ApplicationUserRole> UserRoles { get; } = new List<ApplicationUserRole>();
    }
    
    public class ApplicationUserRole : IdentityUserRole<string>
    {
        public virtual ApplicationUser User { get; set; }
        public virtual ApplicationRole Role { get; set; }
    }
    
    public class ApplicationRole : IdentityRole<string>
    {
        public ApplicationRole(){ }
    
        public ApplicationRole(string roleName)
            : base(roleName)
        {
        }
    
        public virtual ICollection<ApplicationUserRole> UserRoles { get; } = new List<ApplicationUserRole>();
    }
    

    これによりナビゲーションが作成されますが、RoleId1のような追加の列が作成されます およびDiscriminator 。そこで、IdentityUserPOCOナビゲーションプロパティの追加

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
    
        builder.Entity<ApplicationUser>()
            .HasMany(e => e.UserRoles)
            .WithOne()
            .HasForeignKey(e => e.UserId)
            .IsRequired()
            .OnDelete(DeleteBehavior.Cascade);
    
        builder.Entity<ApplicationUserRole>()
            .HasOne(e => e.User)
            .WithMany(e => e.UserRoles)
            .HasForeignKey(e => e.UserId);
    
        builder.Entity<ApplicationUserRole>()
            .HasOne(e => e.Role)
            .WithMany(e => e.UserRoles)
            .HasForeignKey(e => e.RoleId);
    }
    

    しかし、私はまだ両方の列を持っていますRoleId1 およびDiscriminator 。その後、ApplicationDbContext、DI構成サービス、およびDBシードの新しいApplicationRoleクラスに置き換えます。

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string, IdentityUserClaim<string>
        , ApplicationUserRole, IdentityUserLogin<string>, IdentityRoleClaim<string>, IdentityUserToken<string>>
    {
        ...
    }
    
    public void ConfigureServices(IServiceCollection services)
    {
       ...
       services.AddIdentity<ApplicationUser, ApplicationRole>()
                .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddDefaultTokenProviders();
       ...
    }
    
    public DbInitializer(
            ApplicationDbContext context,
            UserManager<ApplicationUser> userManager,
            RoleManager<ApplicationRole> roleManager)
        {
            _context = context;
            _userManager = userManager;
            _roleManager = roleManager;
        }
    
    public async void Initialize()
        {
            _context.Database.EnsureCreated();
    
            if (!_context.Roles.Any(r => r.Name == SharedConstants.Role.ADMINISTRATOR))
                await _roleManager.CreateAsync(new ApplicationRole(SharedConstants.Role.ADMINISTRATOR));
        }            
    

    また、ナビゲートして役割の名を取得することもできました。

    ctx.Users.Select(e => new
                {
                    e.Id,
                    e.UserName,
                    e.Email,
                    e.PhoneNumber,
                    Roles = e.UserRoles.Select(i => i.Role.Name).ToList()
                }).ToList();
    

    これがClaimsの手がかりになることを願っています ナビゲーションプロパティ。



    1. SQLで指定されたレコードの次のレコードを見つける方法は?

    2. C#を使用してMySQLのステートメントを更新する

    3. Oracle18cおよび19cのドロップ列のバグへの対処

    4. SQLServerデータベースで外部キー制約を削除する方法-SQLServer/TSQLチュートリアルパート75