Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

.NET Core 2.1 Identity obtém todos os usuários com suas funções associadas


Agora implementei a seguinte solução.

Como CodeNotFound apontou nos comentários, IdentityUser costumava ter um Roles propriedade. Esse não é mais o caso no .NET Core. Este comentário/questão no GitHub parece ser a solução atual para .Net Core. Eu tentei implementá-lo com o seguinte código:

Usuário do aplicativo
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; }
}

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

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

Por fim, certifique-se de que, ao usá-lo, carregue ansiosamente os UserRoles do usuário e, em seguida, o papel do UserRole da seguinte forma:
this.Users = userManager.Users.Include(u => u.UserRoles).ThenInclude(ur => ur.Role).ToList();

Eu tive um problema em que o Role propriedade de cada UserRole era nulo e isso foi resolvido adicionando o .ThenInclude(ur => ur.Role) papel.

Documento da Microsoft sobre carregamento antecipado de vários níveis:https://docs.microsoft.com/en-us/ef/core/querying/related-data#inclusive-multiple-levels

Atualização do ASP Core 2.2

Inerente de IdentityUserRole<Guid> not stringVocê também pode precisar remover o código no ModelBuilder para que as migrações funcionem.