Отображение NHibernate одного класса, содержащего 2 ссылки на одну и ту же сущность - PullRequest
1 голос
/ 02 марта 2010

У меня есть личный класс, затем есть семейный класс, где у меня есть свойство Father и свойство Mother типа Person.

У меня есть таблица базы данных Person и таблица Family, содержащая FamilyId, FatherId, MotherId, где FatherId и MotherId - внешние ключи для таблицы PersonId в Person.

Как вы собираетесь отобразить это в NHibernate?

Ответы [ 2 ]

2 голосов
/ 03 марта 2010

Это отображение выражает ваши таблицы.

public class Family
{
    public virtual int Id { get; set; }
    public virtual Person Mother { get; set; }
    public virtual Person Father { get; set; }
}

<class name="Family">
    <id name="Id" column="FamilyId">
        <generator class="native" />
    </id>
    <many-to-one name="Mother" column="MotherId" />
    <many-to-one name="Father" column="FatherId" />
</class>
1 голос
/ 03 марта 2010

Возможно, у вас есть веские причины для вашего дизайна в данном контексте.

Теоретически, вам часто лучше с более слабосвязанным, гибким, ролевым дизайном.

Под этим я подразумеваю, что человек - это «Сторона», а отец и мать - это «Роли», которые может сыграть человек (другие роли для «Стороны» могут быть сотрудником, клиентом, другом и т. Д.) .

Мне лично нравится шаблон DNC Питера Коада для решения этой конкретной проблемы проектирования. Статью можно найти здесь: http://edn.embarcadero.com/article/32543

Несколько лет назад я работал над большой ERP-системой, где я представил DNC в контексте C # + NHibernate, поэтому я знаю, что это работает и на практике; -)

Для подробного анализа образца / архетипа ролей взгляните на книгу Корпоративные шаблоны и MDA: создание лучшего программного обеспечения с шаблонами архетипов и UML .

Также ведутся исследования для решения этой проблемы на уровне языка, а не с использованием шаблона, называемого DCI: http://www.artima.com/articles/dci_visionP.html

...