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

Tożsamość .NET Core 2.1 pozyskuje wszystkich użytkowników wraz z przypisanymi im rolami

Wdrożyłem teraz następujące rozwiązanie.

Jak CodeNotFound wskazał w komentarzach, IdentityUser miał kiedyś Roles własność. Nie dotyczy to już platformy .NET Core. Ten komentarz/problem na GitHub wydaje się być aktualnym rozwiązaniem dla .Net Core. Próbowałem go zaimplementować za pomocą następującego kodu:

Użytkownik aplikacji

public class ApplicationUser : IdentityUser
{
    public ICollection<ApplicationUserRole> UserRoles { get; set; }
}

Rola użytkownika aplikacji

public class ApplicationUserRole : IdentityUserRole<string>
{
    public virtual ApplicationUser User { get; set; }
    public virtual ApplicationRole Role { get; set; }
}

Rola aplikacji

public class ApplicationRole : IdentityRole
{
    public ICollection<ApplicationUserRole> UserRoles { get; set; }
}

Kontekst DB

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

Uruchomienie

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

Na koniec upewnij się, że kiedy go używasz, skwapliwie ładujesz role użytkownika, a następnie rolę użytkownika, jak na przykład:

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

Miałem problem, gdy Role właściwość każdej UserRole był pusty i został rozwiązany przez dodanie .ThenInclude(ur => ur.Role) część.

Dokument Microsoft dotyczący wielopoziomowego szybkiego ładowania:https://docs.microsoft.com/en-us/ef/core/querying/related-data#Include-multiple-levels

Aktualizacja ASP Core 2.2

Dziedziczone z IdentityUserRole<Guid> not stringMoże być również konieczne usunięcie kodu w ModelBuilder, aby migracje działały.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak załadować konfigurację JDBC z przykładowego pliku właściwości

  2. Biblioteka nie załadowana:błąd libmysqlclient.16.dylib podczas próby uruchomienia 'rails server' na OS X 10.6 z mysql2 gem

  3. Dlaczego kolumna tekstowa nie może mieć wartości domyślnej w MySQL?

  4. Jak dynamicznie korzystać z wielu baz danych dla jednego modelu w CakePHP?

  5. Błąd w MySQL podczas ustawiania domyślnej wartości DATE lub DATETIME