2017-08-24 6 views
1

In EF Core 2.0 Navigation sind die Navigationseigenschaften standardmäßig nicht enthalten, daher habe ich sie nach dem Upgrade hinzugefügt. Also für Many-to-many-Beziehung zwischen Benutzer- und Rollen und One-to-many-Beziehung zwischen Rolle und RoleClaim, habe ich folgende Navigationseigenschaften:EF Core 2.0 Identity - Hinzufügen von Navigationseigenschaften

public class User : IdentityUser 
{ 
    [Required] 
    public string Name { get; set; } 

    public virtual ICollection<IdentityUserRole<string>> Roles { get; set; } 
} 

public class Role : IdentityRole 
{ 
    [Required] 
    public string Name { get; set; } 

    public virtual ICollection<IdentityRoleClaim<string>> Claims { get; set;} 
} 

Überraschenderweise fügt es einen zusätzlichen RoleId1 Schlüssel zum AspNetRoleClaims Tisch und UserId1 zu AspNetUserRoles Tabellen und alle Get-Abfragen verwenden tatsächlich neue Schlüssel anstelle von RoleId und UserId, die auch vorhanden sind.

+0

Siehe die Antwort auf diesen Thread https://stackoverflow.com/a/47772406/82197 – leen3o

Antwort

2

Ich weiß nicht warum, es gibt nicht diese nützlichen Navigationseigenschaften. Ich möchte Benutzer mit ihren Rollen auflisten.

So habe ich die folgen:

public class ApplicationUser : IdentityUser 
{ 
    public virtual ICollection<ApplicationUserRole> UserRoles { get; } = new List<ApplicationUserRole>(); 
} 

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

public class ApplicationRole : IdentityRole<string> 
{ 
    public ApplicationRole(){ } 

    public ApplicationRole(string roleName) 
     : base(roleName) 
    { 
    } 

    public virtual ICollection<ApplicationUserRole> UserRoles { get; } = new List<ApplicationUserRole>(); 
} 

Dies schafft die Navigation, aber es schafft zusätzliche Spalten wie RoleId1 und Discriminator. Also habe ich folgendes nach Add IdentityUser POCO Navigation Properties hinzugefügt.

protected override void OnModelCreating(ModelBuilder builder) 
{ 
    base.OnModelCreating(builder); 

    builder.Entity<ApplicationUser>() 
     .HasMany(e => e.UserRoles) 
     .WithOne() 
     .HasForeignKey(e => e.UserId) 
     .IsRequired() 
     .OnDelete(DeleteBehavior.Cascade); 

    builder.Entity<ApplicationUserRole>() 
     .HasOne(e => e.User) 
     .WithMany(e => e.UserRoles) 
     .HasForeignKey(e => e.UserId); 

    builder.Entity<ApplicationUserRole>() 
     .HasOne(e => e.Role) 
     .WithMany(e => e.UserRoles) 
     .HasForeignKey(e => e.RoleId); 
} 

Aber ich habe noch beide Spalten RoleId1 und Discriminator. Danach ersetze ich mit der neuen ApplicationRole-Klasse in ApplicationDbContext, DI-Konfigurationsdienst und DB Seed.

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string, IdentityUserClaim<string> 
    , ApplicationUserRole, IdentityUserLogin<string>, IdentityRoleClaim<string>, IdentityUserToken<string>> 
{ 
    ... 
} 

public void ConfigureServices(IServiceCollection services) 
{ 
    ... 
    services.AddIdentity<ApplicationUser, ApplicationRole>() 
      .AddEntityFrameworkStores<ApplicationDbContext>() 
      .AddDefaultTokenProviders(); 
    ... 
} 

public DbInitializer(
     ApplicationDbContext context, 
     UserManager<ApplicationUser> userManager, 
     RoleManager<ApplicationRole> roleManager) 
    { 
     _context = context; 
     _userManager = userManager; 
     _roleManager = roleManager; 
    } 

public async void Initialize() 
    { 
     _context.Database.EnsureCreated(); 

     if (!_context.Roles.Any(r => r.Name == SharedConstants.Role.ADMINISTRATOR)) 
      await _roleManager.CreateAsync(new ApplicationRole(SharedConstants.Role.ADMINISTRATOR)); 
    }    

Auch ich konnte navigieren und den Vornamen der Rolle erhalten.

ctx.Users.Select(e => new 
      { 
       e.Id, 
       e.UserName, 
       e.Email, 
       e.PhoneNumber, 
       Roles = e.UserRoles.Select(i => i.Role.Name).ToList() 
      }).ToList(); 

Ich hoffe, das Ihnen einen Anhaltspunkt für Claims Navigationseigenschaft geben.

+0

Danke für die sehr gründliche Antwort. Ich bin einfach dagegen gestoßen, habe deinem Rat gefolgt und es ist gut jetzt zu gehen! –

Verwandte Themen