¿Cómo se correlaciona una clase con otras instancias de la misma clase cuando esa relación tiene propiedades en sí?Asignaciones de NHibernate cuando las relaciones de unión automática tienen propiedades adicionales
tengo una clase llamada Persona que se asigna a una persona mesa
PersonID PersonName PersonAge
----------------------------------
1 Dave Dee 55
2 Dozy 52
3 Beaky 45
4 Mick 55
5 Tich 58
Quiero una relación de muchos a muchos entre persona y persona usando una tabla de unión llamado PersonPerson:
PersonPersonID PersonID RelatedPersonID RelationshipID
--------------------------------------------------------
1 1 5 1
2 3 4 2
3 2 1 3
quiero los siguientes atributos en la tabla PersonPerson:
RelationshipID RelationshipName
--------------------------------
1 Colleague
2 Manager
3 Tutor
This question y el enlace a post by Billy McCafferty explica que la relación PersonPerson debe promoverse desde una JOIN normal a una entidad en sí misma debido a las columnas adicionales en la tabla PersonPerson. Sin embargo, no explica a qué cuándo es una auto-unión. La diferencia es que si pregunto por todas las personas relacionadas a Dave Dee (ID = 1), no solo debería obtener Tich (ID = 5), sino que también debería obtener Dozy (ID = 2) también porque Dave Dee también está en la columna RelatedPersonID.
Lo que mi solución es hasta ahora, es tener dos propiedades en mi clase 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;
}
}
y tienen el siguiente en el 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>
Esto parece un poco torpe y poco elegante. NHibernate generalmente tiene soluciones elegantes para la mayoría de los problemas cotidianos. ¿Es lo anterior la forma sensata de hacerlo o hay una mejor manera?
@Frederik Gheysels Gran respuesta, lo intentaré ahora. ¡Parece una solución obvia ahora que lo has dicho! –
@Frederik: me gusta la idea de hacer esto en el repositorio, pero todavía no está claro cómo recuperaría todas las instancias relacionadas y los tipos de relación. –
Devolvería los objetos Persona que tienen una relación con la persona dada. Por supuesto, esos objetos Person tienen su colección 'PersonPerson' que contiene todas las relaciones que tiene esta Persona. –