Mysql
 sql >> Datenbank >  >> RDS >> Mysql

.NET Core 2.1 Identity erhält alle Benutzer mit ihren zugeordneten Rollen

Ich habe jetzt folgende Lösung implementiert.

Wie CodeNotFound in den Kommentaren anmerkte, hatte IdentityUser früher eine Roles Eigentum. Dies ist in .NET Core nicht mehr der Fall. Dieser Kommentar/Problem auf GitHub scheint die aktuelle Lösung für .Net Core zu sein. Ich habe versucht, es mit dem folgenden Code zu implementieren:

Anwendungsbenutzer

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

ApplicationUserRole

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

Anwendungsrolle

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

Start

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

Stellen Sie schließlich sicher, dass Sie bei der Verwendung eifrig die UserRoles des Benutzers und dann die Rolle des UserRoles wie folgt laden:

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

Ich hatte ein Problem, bei dem die Role -Eigenschaft jeder UserRole war null und dies wurde gelöst, indem .ThenInclude(ur => ur.Role) hinzugefügt wurde Teil.

Microsoft-Dokumentation zum mehrstufigen eifrigen Laden:https://docs.microsoft.com/en-us/ef/core/querying/related-data#inclusive-multiple-levels

ASP Core 2.2-Update

Inhärent von IdentityUserRole<Guid> not stringMöglicherweise müssen Sie auch den Code im ModelBuilder entfernen, damit die Migrationen funktionieren.