2014-03-14 5 views
8

Ich bin neu in asp.net mvc und Entity-Framework-Code zuerst anpassen, ich bin nicht so scharf auf Datenbanken. Ich entschuldige mich im Voraus für falsche Terminologie oder die Art, wie ich Dinge verstehe.Wie kann ich zu einer Lookup-Tabelle mit Entity Framework Code zuerst mit Fluent API

Nun zu der Frage. Ich habe folgende Modelle:
Benutzermodell

public class User 
{ 
    public int UserId { get; set; } 
    public string Username { get; set; } 
    public string Password { get; set; } 

    public int RoleId { get; set; } 

    [ForeignKey("RoleId")] 
    public virtual IEnumerable<Role> Roles { get; set; } 
} 

Role Model

public class Role 
{ 
    public int RoleId { get; set; } 
    public string RoleName { get; set; }  
} 

Was ich schließlich will, ist ein Weg Ef codefirst Ansatz mit dem fließend API zu verwenden, um den Benutzer-ID zur Karte und RoleId in einer User_Role-Tabelle mit einer Eins-zu-viele-Beziehung kann ein Benutzer mehrere Rollen haben: User_Role lookup table

Ich nehme an, dass das, was in this question getan wird, der richtige Ansatz ist, außer dass dort der Autor eine Viele-zu-Viele-Verbindung verwendet. Ich habe es so versucht, aber der Teil mit u => u.users gibt mir einen Fehler (ich nehme an, das ist, weil es keine Benutzereigenschaft im Modell gibt, also beantwortete er seine Frage, aber aktualisierte seine Frage nicht?)

Meine Frage: Was ist der genaue flüssige api-Code, um Ef diese Tabelle für mich erzeugen zu lassen?

Dinge, die ich bin nicht sicher: (Fühlen Sie sich frei zu ignorieren)

  • Ist das der richtige Ansatz für mein Problem?
  • Sobald ich die Nachschlagetabelle habe, ist dies immer noch der richtige Weg, um meine Navigationseigenschaft zu deklarieren, so dass ich sie später wie user.Roles verwenden und ihre Rollen abrufen kann?
  • wo wird die RoleId im User-Modell von, Roles-Tabelle oder User_Role?
  • Hat eine ID in der Lookup-Tabelle irgendeine Verwendung?

Vielen Dank im Voraus! Ich schätze Ihre Expertise sehr.

Antwort

22

Zuerst sollten Sie die RoleId Eigenschaft im User Modell loswerden. Wenn Sie das als Fremdschlüssel verwenden, wird angezeigt, welche einzelne Rolle ein Benutzer hat. Da ein Benutzer viele Rollen haben kann, sollte der Fremdschlüssel nicht in der Benutzertabelle, sondern in der Mapping-Tabelle enthalten sein.

Sie haben also eine Viele-zu-Viele-Beziehung zwischen Benutzern und Rollen, und Entity Framework kann automatisch die erforderliche Zuordnungstabelle erstellen, ohne dass Sie etwas konfigurieren müssen.

Wenn Sie einfach eine Roles Eigenschaft in der User Einheit und eine Users Eigenschaft in der Einheit Role haben, wird EF herausfinden, dass Sie eine Tabelle mit dem Primärschlüssel zwischen den beide, und erstellen Sie eine many-to-many wollen Beide Entitäten als kombinierter Primärschlüssel, der zum Zuordnen von Benutzern zu Rollen verwendet wird.

Wenn ein User aus der Datenbank laden Sie dann die Roles Navigationseigenschaft, um herauszufinden, verwenden können, welche Rollen der Benutzer hat, und Sie können laden ein Role, um herauszufinden, welche Benutzer in dieser Rolle ist.

Der einfachste Weg, um es so etwas wie das wäre zu arbeiten:

public class Context : DbContext 
{ 
    public DbSet<User> Users { get; set; } 
    public DbSet<Role> Roles { get; set; } 

    static Context() 
    { 
     Database.SetInitializer(new DropCreateDatabaseAlways<Context>()); 
    } 

    public Context() 
     : base("Server=localhost;Initial Catalog=Test;Integrated Security=True;") 
    { 
    } 
} 

public class User 
{ 
    public int UserId { get; set; } 
    public string Username { get; set; } 
    public string Password { get; set; } 

    public List<Role> Roles { get; set; } 
} 

public class Role 
{ 
    public int RoleId { get; set; } 
    public string RoleName { get; set; } 

    public List<User> Users { get; set; } 
} 

ausgeführt wird, der Code Ergebnisse in drei Tabellen wie folgt aus: für mich

enter image description here

+0

Dank viel für das Clearing Dinge ! Es funktioniert jetzt richtig. – edgarpetrauskas

+0

Große Antwort! Eine Sache, die nicht mit dem OP übereinstimmt, ist, dass es in UserRoles kein ID-Feld gibt (siehe User_Role im Beziehungsdiagramm des OP). –

Verwandte Themen