Как сопоставить многие со многими ассоциации в NHibernate - PullRequest
0 голосов
/ 11 января 2010

У меня есть несколько таблиц базы данных с именами Project, Employee и Branch. Сотрудник может работать одновременно над несколькими проектами. Точно так же в проекте есть несколько сотрудников. Также проект ведется в определенной отрасли. Чтобы поддерживать все эти отношения, я использую таблицу project_employee_branch, в которой будут храниться связанные первичные ключи трех вышеуказанных таблиц. Например, эта таблица project_employee_branch может содержать строку типа (1,2,3), что означает, что проект, первичный ключ которого равен 1, выполняется в филиале, первичный ключ которого равен 3, и один из его участников проекта является работник с первичным ключом 2.

Как я могу сопоставить все эти ассоциации в NHibernate? Я сопоставил сопоставление «многие-к-одному», используя концепцию внешнего ключа, но не знаю, как отобразить сопоставления этих типов, где используется промежуточная таблица.

1 Ответ

1 голос
/ 11 января 2010

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

проект ведется в конкретном филиале

, что подразумевает наличие простого отношения внешнего ключа от проекта к ветви. И, конечно, если схема выглядит именно так, у вас будет двусторонняя таблица ссылок «многие ко многим», и ваша жизнь будет намного проще.

В любом случае, при наличии трехсторонней комбинации у вас должна быть коллекция компонентов, где компоненты имеют свойства многие-к-одному для двух других типов объектов. В разделе 7.2 документации NHibernate есть пример , но я думаю, что это будет выглядеть примерно так в отображении для Product:

<set name="BranchEmployees" table="product_employee_branch" lazy="true">
    <key column="product_id">
    <composite-element class="Purchase">
        <many-to-one name="Branch" class="Branch" />
        <many-to-one name="Employee" class="Employee"/>
    </composite-element>
</set>
...