2009-07-23 5 views
2

En utilisant NHibernate, comment puis-je mapper le scénario suivant:Comment mapper IDictionary qui a une valeur IList?

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

Dans la base de données que j'ai des tables séparées pour User, Project et Role et une quatrième table pour la relation.

Toute aide serait appréciée.

Répondre

1

Vous ne pouvez pas - de Ayende's blog discussing <map>

Je voudrais souligner que je n'ai toujours pas couvert toutes les options pour < carte />, il sont encore plus d'options (Bien que, IDictionary < K , IList < V >> n'est pas quelque chose qui est possible de mapper, pour les instructions SQL problématiques qui seraient nécessaires pour le faire).

Vous aurez besoin d'une entité/composant intermédiaire. J'aurais probablement une entité ProjectAssignment pour rompre l'association naire entre User, Project et Role - elle va probablement développer des attributs supplémentaires au fil du temps (disons que vous voulez suivre les changements dans les affectations au fil du temps, donc StartDate et EndDate Propriétés).

Quelque chose comme:

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. 
} 

je voudrais qu'élaborer la ProjectAssignment comme une classe persistante dans son propre droit, et les collections User.Assignments comme un à plusieurs normal de tout goût. Enfin, je voudrais ajouter une méthode pour extraire les informations dans un dictionnaire (ou probablement un iLookup si vous utilisez v3.5-cadre): quelque chose comme:

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

Je suis un peu confus au sujet de la façon dont tout va pour s'adapter. Pouvez-vous s'il vous plaît me donner un exemple de ce à quoi l'entité intermédiaire va ressembler et comment je vais la cartographier? –

+0

J'ai étendu ma réponse maintenant. –

+0

Merci beaucoup pour le code :) Ça a marché! –

Questions connexes