3

Mit der ASP.NET Core-Identität erzeuge ich einen neuen Benutzer mit UserManager.CreateAsync() und weise sie einer vorhandenen Rolle mit UserManager.AddToRoleAsync zu. Dies funktioniert, da die Beziehung zwischen Benutzer und Rolle in der Tabelle AspNetUserRoles der Datenbank gespeichert ist.Benutzer mit zugewiesenen Rollen abrufen

Aber wenn ich den Benutzer mit dem UserManager (z. B. UserManager.FindByMail() Methode) abrufen, dann ist die Role Liste leer. Ich habe auch versucht die Include Funktion von EF wie folgt aus:

var user = userManager.Users.Include(u => u.Roles).FirstOrDefault(u => u.Email == "[email protected]"); 

Das gab mir die Ids der n: m-Zuordnungstabelle, die nicht sehr nützlich ist, wie ich die Rollennamen müssen. Das Laden mit einer zweiten Abfrage ist ebenfalls nicht möglich, da das Attributdes Identitätsbenutzers schreibgeschützt ist. Ich würde erwarten, einen List<string> der Rollennamen zu bekommen. Konnte keine Informationen darüber finden.

Für mich scheint die einzige Problemumgehung ein benutzerdefiniertes Attribut zu meinem Benutzer hinzufügen und füllen Sie sie mit den Daten, die ich mit einer zweiten Abfrage abrufen. Aber das ist keine schöne Lösung. Cant glauben, dass ASP.NET Core Identity hat keinen besseren Weg, um diese Daten zu bekommen ...

+0

Fordern Sie keine Tags in den Titel! – Tseng

Antwort

8

UserManager lädt nicht die Beziehungen standardmäßig.

Die manuelle Aufnahme ist ein guter Weg, aber als here angegeben - direkten M: N-Beziehungen sind noch nicht von EntityFramework Kern unterstützt.

So gibt es zwei Möglichkeiten, wie ich sehe:

(Der preffered one) Verwenden

userManager.GetRolesAsync(user); 

Dies wird ein List<string> mit Benutzer-Rollennamen zurück. Oder verwenden Sie eine EF-Abfrage, um IdentityRole Objekte von IdentityUserRole verbunden zu erhalten. Leider erfordert dies eine Annahme mit der Tatsache, dass die Rollen nicht direkt in der Benutzereinheit sind.

ODER Sie können benutzerdefinierte IdentityUserRole implementieren, die eine Beziehung zu IdentityRole dort erstellen und dann Abfrage mit `

Include(user => user.Roles).ThenInclude(role => role.Role) 

Wie eigene Identität Einheiten implementieren zum Beispiel beschrieben wird here. Aber es ist ein komplizierter Ansatz und die Role Objekte werden in den Bindungseinheiten verschachtelt.

[NotMapped] 
public List<string> RoleNames {get; set;} 

und es bei Ihnen freien Willen verwenden ...

+0

I überschreiben IdentityUserRole (und alle anderen Identity-Klassen) und dann .Include (u => u.Roles) .ThenInclude (r => r.Role), aber ich bekomme Fehler Ungültige Spaltenname "AppRoleId1" beim Abrufen des Ergebnisses aus DB. Irgendeine Idee? – Makla

+1

@Makla: Der Col-Name 'AppRoleId1' sieht seltsam aus.Haben Sie eine Migration für Ihre Änderungen generiert? Wenn ja, sieht es gut aus? – rudolfdobias

+0

Der Fehler ist verschwunden, aber die Role-Eigenschaft ist null: http://stackoverflow.com/questions/42388369/entity-framework-asp-net-core-1-list-all-users-with-role-names – Makla

0

Hier ist die Lösung kam ich mit:


Sie können jedoch eine Eigenschaft in Ihrem ApplicationUser erklären. Es ist möglicherweise nicht das effizienteste. Hoffe es hilft jemandem.

public class UserVM 
{ 
    public string Id { get; set; } 
    public string UserName { get; set; } 
    public string Name { get; set; } 
    public string Email { get; set; } 
    public string Roles { get; set; } 
} 

// Project each element of query into List<UserVM> 
var list = (from user in _userManager.Users 
      select new UserVM 
      { 
       Id = user.Id, 
       UserName = user.UserName, 
       Name = user.Name, 
       Email = user.Email 
      }).ToList(); 

list.Select(async user => 
{ 
    var userEntity = await _userManager.FindByIdAsync(user.Id); 
    user.Roles = string.Join("; ", await _userManager.GetRolesAsync(userEntity)); 
}).ToList(); 
Verwandte Themen