Comment mapper une classe à d'autres instances de la même classe lorsque cette relation possède elle-même les propriétés?Mappages NHibernate lorsque les relations d'auto-jointure ont des propriétés supplémentaires
J'ai une classe appelée personne qui est mise en correspondance avec une personne de table
PersonID PersonName PersonAge
----------------------------------
1 Dave Dee 55
2 Dozy 52
3 Beaky 45
4 Mick 55
5 Tich 58
Je veux un grand nombre à plusieurs entre personne et personne à l'aide d'une table de jointure appelé PersonPerson:
PersonPersonID PersonID RelatedPersonID RelationshipID
--------------------------------------------------------
1 1 5 1
2 3 4 2
3 2 1 3
Je veux que les attributs suivants dans la table PersonPerson:
RelationshipID RelationshipName
--------------------------------
1 Colleague
2 Manager
3 Tutor
This question et le lien-à post by Billy McCafferty explique que la relation PersonPerson doit être promue à partir d'un JOIN normal à une entité de son propre droit en raison des colonnes supplémentaires dans la table PersonPerson. Cependant, cela n'explique pas ce qu'il faut faire quand il s'agit d'une auto-participation. La différence étant que si je demande à toutes les personnes liées à Dave Dee (ID = 1), non seulement devrais-je obtenir Tich (ID = 5), mais je devrais obtenir aussi obtenir Dozy (ID = 2) car Dave Dee est également dans la colonne RelatedPersonID.
Ce que ma solution est jusqu'à présent, est d'avoir deux propriétés dans ma classe Person.
public virtual IList<PersonPerson> PersonPersonForward {get;set;}
public virtual IList<PersonPerson> PersonPersonBack {get;set;}
private List<PersonPerson> personPersonAll;
public virtual List<PersonPerson> PersonPersonAll
{
get
{
personPersonAll = new List<PersonPerson>(PersonPersonForward);
personPersonAll.AddRange(PersonPersonBack);
return personPersonAll;
}
}
et ont les éléments suivants dans l'HBM:
<bag name="PersonPersonForward" table="PersonPerson" cascade="all">
<key column="PersonID"/>
<one-to-many class="PersonPerson" />
</bag>
<bag name="PersonPersonBack" table="PersonPerson" cascade="all">
<key column="RelatedPersonID"/>
<one-to-many class="PersonPerson" />
</bag>
Cela semble un peu maladroit et inélégante. NHibernate a habituellement des solutions élégantes à la plupart des problèmes quotidiens. Est-ce que ce qui précède est la façon sensée de le faire ou existe-t-il un meilleur moyen?
@Frederik Gheysels Bonne réponse, je vais essayer ça maintenant. Cela semble une solution évidente maintenant que vous l'avez dit! –
@Frederik - J'aime l'idée de faire cela dans le dépôt, mais je ne sais toujours pas comment je récupérerais toutes les instances liées et les types de relations. –
Je retournerais les objets Personne qui ont une relation avec la personne donnée. Bien sûr, ces objets Person ont leur collection 'PersonPerson' qui contient toutes les relations que cette personne a. –