Как вы сопоставляете класс с другими экземплярами того же класса , когда это отношение имеет собственные свойства?Отображения NHibernate, когда отношения с самостоятельным объединением имеют дополнительные свойства
У меня есть класс с именем Person, который преобразуется в таблицу Person
PersonID PersonName PersonAge
----------------------------------
1 Dave Dee 55
2 Dozy 52
3 Beaky 45
4 Mick 55
5 Tich 58
Я хочу много-ко-многим между человеком и человеком с помощью таблицы объединения под названием PersonPerson:
PersonPersonID PersonID RelatedPersonID RelationshipID
--------------------------------------------------------
1 1 5 1
2 3 4 2
3 2 1 3
Я хочу, чтобы следующие атрибуты в PersonPerson таблице:
RelationshipID RelationshipName
--------------------------------
1 Colleague
2 Manager
3 Tutor
This question, а связанный с post by Billy McCafferty поясняет, что отношения PersonPerson должны продвигаться от обычного JOIN к объекту в своем собственном праве из-за дополнительных столбцов в таблице PersonPerson. Однако это не объясняет, к чему, когда это самосоединение. Разница в том, что если я попрошу всех связанных людей до Dave Dee (ID = 1), я должен получить не только Tich (ID = 5), но я также должен получить Dozy (ID = 2), так как Dave Dee также находится в столбце RelatedPersonID.
До сих пор мое решение состоит в том, чтобы иметь два свойства в моем классе 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;
}
}
И имеют следующее НВМ:
<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>
Это кажется мелочью неуклюжим и безвкусный. NHibernate обычно имеет элегантные решения для большинства повседневных проблем. Является ли выше разумный способ сделать это или есть лучший способ?
@Frederik Gheysels Отличный ответ, я попробую это сейчас. Теперь кажется очевидным решением, что вы это сказали! –
@Frederik - Мне нравится идея сделать это в репозитории, но мне все еще неясно, как я верну все связанные экземпляры и типы отношений. –
Я бы вернул объекты Person, которые имеют отношения с данным человеком. Итак, эти объекты Person имеют свою коллекцию PersonPerson, которая содержит все отношения, которые имеет этот Человек. –