Ora ho implementato la seguente soluzione.
Come CodeNotFound sottolineato nei commenti, IdentityUser aveva un Roles
proprietà. Questo non è più il caso in .NET Core. Questo commento/problema
su GitHub sembra essere la soluzione attuale per .Net Core. Ho tentato di implementarlo con il seguente codice:
Utente applicazione
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; }
}
Ruolo dell'applicazione
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();
});
}
}
Avvio
services.AddIdentity<ApplicationUser, ApplicationRole>(options => options.Stores.MaxLengthForKeys = 128)
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
Infine, assicurati di caricare con entusiasmo i ruoli utente dell'utente e poi il ruolo utente in questo modo:
this.Users = userManager.Users.Include(u => u.UserRoles).ThenInclude(ur => ur.Role).ToList();
Ho avuto un problema con il Role
proprietà di ogni UserRole
era nullo e ciò è stato risolto aggiungendo .ThenInclude(ur => ur.Role)
parte.
Documento Microsoft sul caricamento ansioso multilivello:https://docs.microsoft.com/en-us/ef/core/querying/related-data#inclusi-multiple-levels
Aggiornamento ASP Core 2.2
Inerente da IdentityUserRole<Guid>
not stringPotrebbe anche essere necessario rimuovere il codice in ModelBuilder per far funzionare le migrazioni.