Mysql
 sql >> Base de données >  >> RDS >> Mysql

.NET Core 2.1 Identity obtient tous les utilisateurs avec leurs rôles associés

J'ai maintenant implémenté la solution suivante.

Comme CodeNotFound l'a souligné dans les commentaires, IdentityUser avait un Roles biens. Ce n'est plus le cas dans .NET Core. Ce commentaire/problème sur GitHub semble être la solution actuelle pour .Net Core. J'ai tenté de l'implémenter avec le code suivant :

ApplicationUser

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

ApplicationRole

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

Démarrage

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

Enfin, assurez-vous que lorsque vous l'utilisez, vous chargez avec impatience les UserRoles de l'utilisateur, puis le rôle de l'UserRole comme suit :

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

J'ai eu un problème où le Role propriété de chaque UserRole était nul et cela a été résolu en ajoutant dans le .ThenInclude(ur => ur.Role) partie.

Doc Microsoft sur le chargement hâtif à plusieurs niveaux :https://docs.microsoft.com/en-us/ef/core/querying/related-data#incluant-multiple-levels

Mise à jour ASP Core 2.2

Inhérent de IdentityUserRole<Guid> not stringVous devrez peut-être également supprimer le code dans ModelBuilder pour que les migrations fonctionnent.