sql >> Database >  >> RDS >> Mysql

.NET Core 2.1 Identity krijgt alle gebruikers met hun bijbehorende rollen

Ik heb nu de volgende oplossing geïmplementeerd.

Zoals CodeNotFound in de opmerkingen aangaf, had IdentityUser een Roles eigendom. Dit is niet langer het geval in .NET Core. Deze commentaar/issue op GitHub lijkt de huidige oplossing te zijn voor .Net Core. Ik heb geprobeerd het te implementeren met de volgende code:

Applicatiegebruiker

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

ToepassingGebruikersrol

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

Toepassingsrol

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

Opstarten

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

Zorg er ten slotte voor dat wanneer u het gebruikt, u gretig de User's UserRoles laadt, en vervolgens de UserRole's Rol als volgt:

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

Ik had een probleem waarbij de Role eigenschap van elke UserRole was null en dit is opgelost door het toevoegen van de .ThenInclude(ur => ur.Role) onderdeel.

Microsoft-document over enthousiast laden op meerdere niveaus:https://docs.microsoft.com/en-us/ef/core/querying/related-data#inclusief-multiple-levels

ASP Core 2.2-update

Inherent aan IdentityUserRole<Guid> not string Mogelijk moet u ook de code in de ModelBuilder verwijderen om migraties te laten werken.



  1. ProxySQL uitvoeren als Kubernetes-service

  2. Deel 2:Beeldclassificatie met MariaDB Server en TensorFlow - een zelfstudie

  3. Waarschuwing:kan header-informatie niet wijzigen - headers zijn al per fout verzonden

  4. Aan de slag met Postgres 13 op Ubuntu 20.04