2010-08-10 11 views
3

Je ne sais pas comment exprimer la question correctement, donc désolé à l'avance. En utilisant FluentNHibernate en particulier, comment allez-vous rendre vos entités pour certaines tables qui ont été référencées par BEAUCOUP d'autres tables?Entités NHibernate et Associations multiples

Par exemple une entité Employee. Les employés sont généralement utilisés presque partout et il serait logique pour certains programmes que leurs employés contiennent plusieurs rôles, plusieurs tâches ou plusieurs avantages. En ce moment, j'imaginais à être comme ceci:

public class Employee 
{ 
    public virtual Employee() 
    { 
     Tasks = new List<Task>(); 
     Roles = new List<Role>(); 
     Benefits = new List<Benefit>(); 
    } 

    public virtual Id { get; set; } 
    public virtual Name { get; set; } 

    public virtual IList<Task> Tasks { get; protected set; } 
    public virtual IList<Role> Roles { get; protected set; } 
    public virtual IList<Benefit> Benefits { get; protected set; } 

    public virtual void AddTask(Task task) 
    { 
     task.Employee = this; 
     Tasks.Add(task); 
    } 
    public virtual void AddBenefit(Benefit benefit) 
    { 
     benefit.Employee = this; 
     Benefits.Add(benefit); 
    } 
    public virtual void AddBenefit(Benefit benefit) 
    { 
     benefit.Employee = this; 
     Benefits.Add(benefit); 
    } 
} 

public class EmployeeMapper : ClassMap<Employee> 
{ 
    public EmployeeMapper() 
    { 
     id(x => x.Id); 
     Map(x => x.Name); 
     HasMany(x => x.Tasks); 
     HasMany(x => x.Roles); 
     HasMany(x => x.Benefits); 
    } 
} 

Maintenant whiel dans cet exemple, il y a seulement 3 collections, il y a la possibilité que ça va grandir et grandir avec chaque association fait à l'employé. Comme dans un système de ressources humaines, il sera associé à tout ce qui concerne la paie, les adresses, les taxes, les déductions, etc. Ne serait-il pas trop exagéré si je fais une collection pour chaque petite référence que j'appelle?

Y a-t-il un modèle pour éviter ce scénario de venir ou est-ce que NHibernate est conçu pour que je doive référencer chaque objet qui a une contrainte de clé étrangère sur mes objets?

+1

L'employé n'a pas à connaître toutes les références fk à lui-même. Ne faites cela que pour ceux que vous avez réellement besoin de référencer par l'employé. – dotjoe

+0

Cela signifie que lorsque le wiki dit "dans une relation où les deux côtés sont mappés, NHibernate a besoin de vous pour définir les deux côtés avant de sauvegarder correctement.", "Les deux côtés sont mappés" signifie que les deux côtés ont une propriété autre? D'après ce que j'ai compris à l'origine de cette déclaration, je pensais que cela signifiait que cela devait être fait lorsque les deux côtés sont mappés à une table. – Jonn

+1

Oui, cela signifie simplement que ** IF ** vous mappez les deux côtés, alors vous devez définir explicitement les propriétés des deux côtés comme 'parent.children.Add (child); child.parent = parent; ' – dotjoe

Répondre

2

L'employé n'a pas besoin de connaître chaque référence fk à lui-même. Ne faites cela que pour ceux que vous avez réellement besoin de référencer par l'employé.

dans une relation où les deux parties sont mis en correspondance , NHibernate vous faut définir les deux côtés avant qu'il économisera correctement.

Cela signifie simplement que SI vous associez les deux côtés, alors vous devez définir explicitement les propriétés des deux côtés comme

parent.children.Add(child); 
child.parent = parent; 
+0

Est-ce encore vrai si vous utilisez des cascades? Il me semble que l'autre côté serait mis à jour automagically – Shagglez

Questions connexes