sql >> Database teknologi >  >> RDS >> Mysql

.NET Core 2.1 Identity får alle brugere med deres tilknyttede roller

Jeg har nu implementeret følgende løsning.

Som CodeNotFound påpegede i kommentarerne, plejede IdentityUser at have en Roles ejendom. Dette er ikke længere tilfældet i .NET Core. Denne kommentar/issue på GitHub ser ud til at være den nuværende løsning til .Net Core. Jeg har forsøgt at implementere det med følgende kode:

Applikationsbruger

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

Application UserRole

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

Applikationsrolle

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

Opstart

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

Sørg endelig for, når du bruger det, at du ivrigt indlæser brugerens brugerroller, og så brugerrollens rolle sådan:

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

Jeg havde et problem, hvor Role egenskab for hver UserRole var null, og dette blev løst ved at tilføje .ThenInclude(ur => ur.Role) del.

Microsoft-dokument om ivrig indlæsning på flere niveauer:https://docs.microsoft.com/en-us/ef/core/querying/related-data#including-multiple-levels

ASP Core 2.2-opdatering

Iboende fra IdentityUserRole<Guid> not string.Du skal muligvis også fjerne koden i ModelBuilder for at få migreringerne til at virke.



  1. Konvertering mellem dato- og klokkeslætsdatatyper i SQL Server (T-SQL-eksempler)

  2. Sådan finder du minimumsværdien af ​​en kolonne i SQL

  3. AWS RDS backup metoder

  4. 3 funktioner, der henter dagen, måneden og året fra en dato i PostgreSQL