NHibernate отображает одну таблицу на два класса, где выбор - PullRequest
5 голосов
/ 03 июня 2010

Мы хотели бы отобразить одну таблицу на два класса с помощью NHibernate. Отображение должно быть динамическим в зависимости от значения столбца.

Вот простой пример, чтобы прояснить ситуацию: У нас есть таблица Person с столбцами id, Name и Sex.

alt text

Данные из этой таблицы должны отображаться либо в классе Male, либо в классе Female, в зависимости от значения столбца Sex.

alt text

В псевдокоде:

create instance of Male with data from table Person where Person.Sex = 'm';
create instance of Female with data from table Person where Person.Sex = 'f'; 

Преимущество заключается в том, что у нас есть строго типизированные доменные модели, и мы можем впоследствии избегать операторов переключения.

Возможно ли это с NHibernate или мы должны сначала отобразить таблицу Person в плоский класс Person? Затем мы должны будем использовать метод фабрики, который принимает плоский экземпляр Person и возвращает экземпляр типа Female или Male. Было бы хорошо, если бы NHibernate (или другая библиотека) мог справиться с этим.

1 Ответ

9 голосов
/ 03 июня 2010

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

Вам необходимо указать значение дискриминатора.

<class name="Person">
  <id .../>

  <discriminator column="Sex" type="string" length="1" />

  <property name="Name"/>
  <!-- add more Person-specific properties here -->

  <subclass name="Male" discriminator-value="m">
    <!-- You could add Male-specific properties here. They 
     will be in the same table as well. Or just leave it empty. -->
  </subclass>

  <subclass name="Female" discriminator-value="f">
    <!-- You could add Female-specific properties here. They 
     will be in the same table as well. Or just leave it empty. -->
  </subclass>

</class>
...