sql >> Database teknologi >  >> RDS >> Mysql

EF Core 2.0 Identity - Tilføjelse af navigationsegenskaber

Jeg ved ikke hvorfor, der er ikke disse nyttige navigationsegenskaber. Jeg vil gerne vise brugere med deres roller.

Så jeg gjorde følgende:

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

Dette skaber navigationen, men det skaber yderligere kolonner som RoleId1 og Discriminator . Så jeg tilføjede følgende i henhold til Tilføj IdentityUser POCO-navigationsegenskaber .

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

Men jeg har stadig begge kolonner RoleId1 og Discriminator . Derefter erstatter jeg med den nye ApplicationRole-klasse i ApplicationDbContext, DI-konfigurationstjeneste og DB-seed.

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

Jeg kunne også navigere og få rollens fornavn.

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

Jeg håber, at dette giver dig et fingerpeg om Claims navigationsegenskab.



  1. Schema Management Tips til MySQL &MariaDB

  2. Skal der være én SQLiteOpenHelper for hver tabel i databasen?

  3. Hvilke rækker returneres ved brug af LIMIT med OFFSET i MySQL?

  4. Hvordan returnerer man kun arbejdstid fra reservationer i PostgreSql?