2009-07-23 5 views
2

NHibernate verwenden, wie kann ich das folgende Szenario Karte:Wie IDictionary mit einem IList-Wert zugeordnet werden?

public class User 
{ 
    public virtual IDictionary<Project, IList<Role>> ProjectAssignments { get; set; } 
} 

In der Datenbank Ich habe separate Tabellen für User, Project und Role und eine vierte Tabelle für die Beziehung.

Jede Hilfe wäre willkommen.

Antwort

1

Sie können nicht - von Ayende's blog discussing <map>

Ich möchte darauf hinweisen, dass ich immer noch nicht alle Optionen abgedeckt für < Karte /> gibt sind noch mehr Optionen (Obwohl, IDictionary < K , IList < V >> ist nicht etwas, das möglich ist, für die problematischen SQL-Anweisungen, die dazu erforderlich wären, zuzuordnen.

Sie benötigen eine zwischengeschaltete Entität/Komponente. Ich würde wahrscheinlich eine ProjectAssignment-Entität haben, um die nary Verbindung zwischen Benutzer, Projekt und Rolle aufzubrechen - es wird wahrscheinlich zusätzliche Attribute mit der Zeit wachsen (sagen Sie, dass Sie Änderungen an den Zuordnungen im Laufe der Zeit verfolgen wollen), so wird StartDate und EndDate Eigenschaften).

Etwas wie:

public class User { 
    // ... other attributes etc. 
    public virtual ISet<ProjectAssignment> Assignments {get;set;} 
} 

public class Project { 
    // ... other attributes etc. 
    public virtual ISet<ProjectAssignment> Assignments {get;set;} 
} 

public class Role { 
    // ... other attributes etc. 
} 

public class ProjectAssignment 
{ 
    public virtual Int64 {get;set;} 
    public virtual User User {get;set;} 
    public virtual Project Project {get;set;} 
    public virtual Role Role {get;set;} 
    // ... other attributes etc. 
} 

würde ich in seinem eigenen Recht die ProjectAssignment als persistente Klasse Karte nur, und die User.Assignments Sammlungen als normale Eins-zu-viele, gleich welchen Geschmacks. Schließlich würde ich eine Methode hinzufügen, die Details in ein Wörterbuch (oder wahrscheinlich ein ILookup, wenn Sie Framework-Version 3.5 verwenden) zu extrahieren: so etwas wie:

ILookup<Project, Role> GetRolesByProject() { 
    return Assignments.ToLookup(x => x.Project, x => x.Role); 
} 
+0

ich ein wenig verwirrt bin darüber, wie alles geht ist passen. Können Sie mir bitte ein Beispiel dafür geben, wie die zwischengeschaltete Stelle aussehen wird und wie ich sie abbilden würde? –

+0

Ich habe meine Antwort jetzt erweitert. –

+0

Vielen Dank für den Code :) Es hat funktioniert! –

Verwandte Themen