sql >> Base de Datos >  >> RDS >> Mysql

.NET Core 2.1 Identity obtiene todos los usuarios con sus roles asociados

Ahora he implementado la siguiente solución.

Como CodeNotFound señaló en los comentarios, IdentityUser solía tener Roles propiedad. Este ya no es el caso en .NET Core. Este comentario/problema en GitHub parece ser la solución actual para .Net Core. He intentado implementarlo con el siguiente código:

Usuario de la aplicación

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

Rol de usuario de la aplicación

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

Rol de aplicación

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

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

Empezar

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

Finalmente, asegúrese de que cuando lo esté usando cargue con entusiasmo los UserRoles del usuario y luego el rol del UserRole de la siguiente manera:

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

Tuve un problema donde el Role propiedad de cada UserRole fue nulo y esto se resolvió agregando .ThenInclude(ur => ur.Role) parte.

Documento de Microsoft sobre la carga ansiosa de varios niveles:https://docs.microsoft.com/en-us/ef/core/querying/related-data#inclusive-multiple-levels

Actualización de ASP Core 2.2

Inherente de IdentityUserRole<Guid> not string Es posible que también deba eliminar el código en ModelBuilder para que las migraciones funcionen.