Отображение NHibernate - один к одному (или один к нулю) - PullRequest
7 голосов
/ 23 декабря 2008

NHibernatians!

У меня есть таблица [dbo]. [Wibble] и другая таблица [dbo]. [WibbleExtended].

[Wibble] - это основная таблица, а [WibbleExtended] - необязательная таблица, в которой хранятся некоторые другие поля. В таблице [WibbleExtended] гораздо меньше записей, чем в основной таблице [Wibble]. Я думаю, что это было сделано когда-то, чтобы вылечить некоторые проблемы с пространством (Wibble имеет много строк, а WibbleExten имеет много столбцов).

Идентификатор для каждой таблицы одинаков и поступает из внешнего источника.

1009 * Т.е. *

[dbo].[Wibble].[WibbleId]

и

[dbo].[WibbleExtended].[WibbleId]

идентичны и так связаны две таблицы.

N.B. Я не могу изменить схему. Я перевожу это на унаследованную систему, которую почти не контролирую.

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

Мои отображения в настоящее время:

<class name="Wibble" table="Wibble" >
   <id name="Id" column="WibbleId" type="Int32">
      <generator class="assigned"/>
   </id>

   <many-to-one name="WibbleExtended" class="WibbleExtended" column="WibbleId" not-null="false" cascade="all"/>
</class>

И

<class name="WibbleExtended" table="WibbleExtended" >
   <id name="Id" column="WibbleId" type="Int32">
        <generator class="assigned" />
   </id>

   <many-to-one name="Wibble" class="Wibble" column="WibbleId" not-null="true" />     
 </class>

Проблема в том, что я получаю такие ошибки, как

System.IndexOutOfRangeException: Invalid index n for this SqlParameterCollection with Count=n.

Я оглянулся, и это похоже на правильную стратегию, это просто падение на последнем препятствии.

Проблема в генераторе идентификатора? Другой аспект картирования?

Бесплатный мясной пирог для правильного ответа.

РЕДАКТИРОВАТЬ: Хорошо - вот что я сделал, чтобы решить эту проблему с помощью @James Gregory.

  1. Переместил модульные тесты из тестов WibbleExtended в класс тестов Wibble и внес необходимые изменения.

  2. Добавлено следующее в Wibble.hbm.xml

    <join table="WibbleExtended" optional="true">
         <key column="WibbleId"/>
         <property name="Blah1" column="Blah1" type="String" length="2000" not-null="false" />
         <property name="Blah2" column="Blah2" type="String" length="1000" not-null="false" />    
    </join>
    
  3. Добавлены соответствующие свойства в Wibble POCO.

  4. Удален весь код, относящийся к WibbleExtended.

  5. Запустить тесты, все пройдено, проверено. Сборка пройдена. Пошел на рождественское пиво (поэтому прошло пару дней, прежде чем я обновил это!: -))

Ответы [ 3 ]

11 голосов
/ 24 апреля 2009

Ошибка, которую вы получаете:

Неверный индекс n для этого SqlParameterCollection с Count = n.

обусловлено двумя свойствами, сопоставленными одному столбцу . Используйте insert = false и update = false в одном из двух.

ссылка http://groups.google.com/group/nhusers/browse_thread/thread/84830b1257efd219

7 голосов
/ 23 декабря 2008

Рассматривали ли вы использование элемента Join , который был представлен в NHibernate 2.0? Этот элемент позволяет объединить несколько таблиц в одну сущность; эти отношения также могут быть необязательными.

1 голос
/ 23 декабря 2008

Проверить эту ссылку: http://www.hibernate.org/hib_docs/nhibernate/html/inheritance.html

В частности, отображение «объединенный подкласс», я думаю, вы найдете полезным (при условии, что WibbleExtended наследует от Wibble).

...