NHibernate: один и тот же класс для нескольких таблиц - PullRequest
1 голос
/ 05 декабря 2009

У меня есть класс вложения файла (FileAttachment), который используется в нескольких других классах.

например. Статья содержит несколько вложений. Категория содержит несколько вложений. Эти вложения в действительности являются одним и тем же классом FileAttachment, но по понятной причине они сохраняются в разных таблицах. например вложение файла для статьи в таблице Article_FileAttachments и вложение файла категории в таблицу Category_FileAttachments.

Как я могу представить эти отношения в отображениях nhibernate? ТНХ

Ответы [ 2 ]

1 голос
/ 09 марта 2010

Пожалуйста, смотрите главу 8 для правил полиморфного отображения с NHibernate.

Короче говоря, вам потребуется столбец дискриминатора, чтобы указать, какой дискриминатор сохраняется в какой таблице. Вот пример из документации NHibernate, ИЛИ, если вы используете наследование, вам нужно будет только сопоставить ваши производные классы как подклассы и указать имя для каждого из них в сопоставлении классов базового типа.

<class name="IPayment" table="PAYMENT">
  <id name="Id" type="Int64" column="PAYMENT_ID">
    <generator class="native"/>
  </id>
  <property name="Amount" column="AMOUNT"/>
  ...
  <joined-subclass name="CreditCardPayment" table="CREDIT_PAYMENT">
    <key column="PAYMENT_ID"/>
    ...
  </joined-subclass>
  <joined-subclass name="CashPayment" table="CASH_PAYMENT">
    <key column="PAYMENT_ID"/>
    ...
  </joined-subclass>
  <joined-subclass name="ChequePayment" table="CHEQUE_PAYMENT">
    <key column="PAYMENT_ID"/>
    ...
  </joined-subclass>
</class>

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

Глава 8 - Полиморфное отображение

1 голос
/ 06 декабря 2009

Некоторые варианты здесь - я не знаю, какой из них будет работать лучше для вас:

  1. Вы можете использовать отображение <any>, чтобы делать то, что вы хотите. Больше информации на nhibernate.info документах и от Ayende . Я сам этим не пользовался, поэтому не совсем уверен, что это поможет.
  2. Создание классов ArticleAttachment и CategoryAttachment, которые оба являются производными от FileAttachment. Эти классы могут быть отображены нормально, и NHib не нужно специально рассказывать о базовом классе. Проблема в том, что вы не сможете отобразить коллекцию, которая содержит как ArticleAttachments, так и CategoryAttachments.
  3. Имеется одна таблица FileAttachment, в которой хранятся сведения о всех вложениях. Затем их можно связать с таблицей «Статьи» и «Категория» с помощью соединения <many-to-many>.
...