Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Tożsamość EF Core 2,0 — dodawanie właściwości nawigacji

Nie wiem dlaczego, nie ma tych przydatnych właściwości nawigacyjnych. Chcę wyświetlić listę użytkowników z ich rolami.

Więc zrobiłem co następuje:

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

Tworzy to nawigację, ale tworzy dodatkowe kolumny, takie jak RoleId1 i Discriminator . Dodałem więc następujące elementy zgodnie z Dodaj właściwości nawigacji POCO tożsamości użytkownika .

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

Ale nadal mam obie kolumny RoleId1 i Discriminator . Następnie zamieniam na nową klasę ApplicationRole w ApplicationDbContext, usługę konfiguracji DI i seed DB.

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

Mogłem też nawigować i zdobyć imię roli.

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

Mam nadzieję, że to da ci wskazówkę dotyczącą Claims właściwość nawigacji.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zastąp domyślne wartości null zwrócone z lewego połączenia zewnętrznego

  2. Używanie PHP do przesyłania pliku i dodawania ścieżki do bazy danych MySQL

  3. Xampp MySQL nie uruchamia się — próba uruchomienia usługi MySQL...

  4. ASP.Net / MySQL :Tłumaczenie treści na kilka języków

  5. Problemy ze strefą czasową Java MySQL Timestamp