2016-08-01 21 views
2

Ich habe folgendes ApplicationUser Modell:ASP MVC Build Throwing Warnung für ApplicationUser-Rollen Navigationseigenschaft?

public class ApplicationUser : IdentityUser 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public virtual ICollection<ApplicationRole> Roles { get; set; } 

    public bool HasRole(string _role) 
    { 
     return Roles.Any(r => r.Name == _role); 
    } 

    public bool HasPermission(string _permission) 
    { 
     return Roles.Any(r => r.Permissions 
       .Any(p => p.Name == _permission)); 
    } 
} 

Aber wenn ich ein Build ich die folgende Warnmeldung aus:

ApplicationUser.Roles hides inherited member 
'IdentityUser<string, IdentityUserLogin,IdentityUserRole, IdentityUserClaim>.Roles. 
To make the current member override that implementation, add the overide keyword. Otherwise 
add the new keyword. 

Ist etwas falsch mit meiner Implementierung oder sollte es anders gemacht werden? Ich habe die Navigationseigenschaft "Rollen" hinzugefügt, sodass ich die HasRole- und HasPermission-Methoden implementieren kann.

meine Erlaubnis und ApplicationRole Modelle umgesetzt werden, wie folgt:

public class Permission 
{ 
    public byte Id { get; set; } 
    public string Name { get; set; } 

    public virtual List<ApplicationRole> Roles { get; set; } 
} 


public class ApplicationRole : IdentityRole 
{ 
    public ApplicationRole() : base() { } 
    public ApplicationRole(string name) : base(name) { } 

    public virtual ICollection<Permission> Permissions { get; set; } 

    public bool IsPermissionInRole(string _permission) 
    { 
     return Permissions.Any(p => p.Name == _permission); 
    } 
} 
+0

Ich löschte meine Antwort - nachdem Sie erklärt haben, warum Sie 'Rollen' überschreiben mussten, habe ich nichts nützliches hinzuzufügen - Entschuldigung! Ich kenne die IdentityRole/IdentityUserRole-Klassen und ihre generischen Deklarationen nicht gut genug, um Ihnen im Moment eine Antwort zu geben. –

Antwort

3

Ich habe kein breites Wissen über ASP.NET Identität. Aber nach einer kleinen Suche kann ich dir eine grobe Antwort geben. IdentityUser sollte proeprty Rollen die IdentityUserRole nicht IdentityRole erbt. Ich denke, dieses Modell bezieht IdentityUsers und IdentityRoles. Also, was Sie tun sollten, schaffen ApplicationUserRole Klasse, die IdentityUserRole erbt:

public class ApplicationUserRole : IdentityUserRole 
{ 
    public ApplicationUserRole() 
     : base() 
    { } 

    public virtual ApplicationRole Role { get; set; } 
} 

Inherit Ihre ApplicationRole von IdentityRole<string, ApplicationUserRole>:

public class ApplicationRole 
    : IdentityRole<string, ApplicationUserRole> 
{ 
} 

Dann nutzen Sie diese Klasse in Ihrer ApplicationUser Klasse. Zur Nutzung ApplicationUserRole müssen Sie ApplicationUser von IdentityUser<string, IdentityUserLogin, ApplicationUserRole, IdentityUserClaim> isntead von IdentityUser

public class ApplicationUser 
    : IdentityUser<string, IdentityUserLogin, ApplicationUserRole, IdentityUserClaim> 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    ............. 
} 

Schließlich erben, ändern Sie Ihre HasPermission Methode von ApplicationUser zu so etwas wie:

public bool HasPermission(string _permission) 
{ 
    return Roles.Any(r => r.Role.IsPermissionInRole(_permission)); 
} 

bin ich wieder die besagt, das ist grob antwort. Weitere Informationen zum Erweitern von Identity-Modellen finden Sie unter this code project article.

+0

Ich habe nach Ihrem Vorschlag gemacht, aber ich bekomme immer noch Warnung: 'ApplicationUser.Roles verbirgt geerbten Mitglied 'IdentityUser .Roles. Fügen Sie das overide-Schlüsselwort hinzu, damit das aktuelle Mitglied diese Implementierung überschreibt. Sonst füge das neue Schlüsselwort hinzu. "Vielleicht muss ich' public virtual ICollection Rollen {get; einstellen; } 'zu' public virtual ICollection UserRoles {get; einstellen; } '? – adam78

+0

@ozzii, ich habe meine Antwort aktualisiert. Bitte überprüfen Sie, ob es funktioniert –

+1

Ich befolgte Ihre Anweisungen und schaffte es, es zum Laufen zu bringen. Die einzige zusätzliche Sache war das Entfernen der Navigationseigenschaft 'public virtual ICollection Roles {get; einstellen; } 'aus der ApplicationUser-Klasse.Dies wird nicht mehr benötigt, da wir ApplicationUserRole über die öffentliche Klasse ApplicationUser : IdentityUser 'erben. Wenn Sie Ihre Antwort aktualisieren, werde ich die Lösung markieren. Vielen Dank für deine Hilfe. – adam78