Come si associa una classe ad altre istanze della stessa classe quando tale relazione ha le proprietà stesse?Mapping NHibernate quando le relazioni self-join hanno proprietà aggiuntive
ho una classe denominata persona che è associato a una persona tavolo
PersonID PersonName PersonAge
----------------------------------
1 Dave Dee 55
2 Dozy 52
3 Beaky 45
4 Mick 55
5 Tich 58
Voglio una relazione molti-a-molti tra persona e persona utilizzando una tabella di join chiamato PersonPerson:
PersonPersonID PersonID RelatedPersonID RelationshipID
--------------------------------------------------------
1 1 5 1
2 3 4 2
3 2 1 3
voglio i seguenti attributi nella tabella PersonPerson:
RelationshipID RelationshipName
--------------------------------
1 Colleague
2 Manager
3 Tutor
This question e il collegamento a post by Billy McCafferty spiegano che la relazione PersonPerson deve essere promossa da un normale JOIN a un'entità a sé stante a causa delle colonne aggiuntive nella tabella PersonPerson. Tuttavia non spiega cosa fare quando si tratta di un self-join. La differenza è che se chiedo tutte le persone correlate a Dave Dee (ID = 1), non solo dovrei ottenere Tich (ID = 5), ma dovrei ottenere anche Dozy (ID = 2 anche perché Dave Dee si trova anche nella colonna RelatedPersonID.
Ciò che la mia soluzione è finora, è di avere due proprietà nella mia 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;
}
}
E hanno il seguente nella 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>
questo sembra un po 'goffo e poco elegante. NHibernate di solito ha soluzioni eleganti per la maggior parte dei problemi quotidiani. Quanto sopra è il modo ragionevole di farlo o c'è un modo migliore?
@Frederik Gheysels Ottima risposta, ci proverò ora. Sembra una soluzione ovvia ora che l'hai detto! –
@Frederik: mi piace l'idea di farlo nel repository, ma non mi è ancora chiaro come recuperare tutte le istanze correlate e i tipi di relazione. –
Vorrei restituire gli oggetti Persona che hanno una relazione con la persona data. Offcourse, quegli oggetti Person hanno la loro collezione 'PersonPerson' che contiene tutte le relazioni che questa persona ha. –