2016-03-22 13 views
0

ich in meiner Ansicht nach drei Spalten zeigen will, kombinieren:Asp.Net LINQ drei Tabellen

====================================== 
UserName  | Email | Role Name 
======================================  
codelover12  [email protected] Student  
kimmy45634  [email protected] Teacher  
====================================== 

so zunächst, was ich dachte, dass

ich mit UserIdId in AspNetUsers Tabelle beitreten kann in AspNetUserRoles Tabelle, und auch beitreten Id in AspNetRoles so kann ich herausfinden, wer welche Rolle hat.

Ich war wie folgt versucht:

var model = from users in db.Users 
      join userRoles in db.AspNetUserRoles on users.Id equals roles.UserId 
      join role in db.Roles on role.Id equals userRoles.RoleId 
      select new { users.UserName, users.Email, role.Name }; 

aber herausgefunden, dass ich nicht AspNetUserRoles zugreifen kann. Ich würde Ihre Hilfe zu schätzen wissen.

+0

Was genau meinen Sie mit "kann nicht auf AspNetUserRoles zugreifen"? Gibt Ihre Anfrage einen Fehler? Zumindest sollte es "user.Id equals userRoles.UserId" sein, obwohl Sie stattdessen die Verwendung von Navigationseigenschaften in Betracht ziehen sollten. – juharr

+0

es gibt mir einen Fehler auf db.AspNetUserRoles sagen, dass ApplicationDbContext keine Definition für 'AspNetUserRoles' enthält – kkagill

+0

Meine Vermutung ist, dass ist eine viele zu viele Tabelle, und EF erstellt keine Entitäten für diese. Stattdessen sollten Sie die Navigationseigenschaften verwenden. Etwas wie 'von Benutzer in db.Users von Rolle in user.Roles' – juharr

Antwort

0

EF create Kreuztabelle AspNetUserRoles automatisch. So können Sie Navigationseigenschaften verwenden oder smth wie folgt machen:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{  
    modelBuilder.Entity<AspNetUser>() 
     .HasMany(x => x.Roles) 
     .WithMany(x => x.AspNetUsers) 
    .Map(x => 
    { 
     x.ToTable("AspNetUserRoles"); // third table is named Cookbooks 
     x.MapLeftKey("AspNetUserId"); 
     x.MapRightKey("RoleId"); 
    }); 
} 
+0

danke für Ihre Antwort – kkagill

1

Nun, ich fand es heraus.

Der einfachste Weg, es wurde das Hinzufügen dieser Zeile Code IdentityModels.cs

public DbSet<IdentityUserRole> UserRoles { get; set; } 

dann können Sie jetzt AspNetUserRoles haben Zugang zu tun, und schreiben Codes wie

var findRole = (from userRole in db.UserRoles 
       join role in db.Roles on 
       userRole.RoleId equals role.Id 
       where userRole.UserId == Id 
       select role.Name).ToList(); 

Hope this helfen andere, die ähnliche Probleme haben.