NHibernate отображает базу вместо подкласса - PullRequest
3 голосов
/ 31 августа 2009

В моей бизнес-модели у меня есть класс Entity (IPoint interface ), который имеет список дочерних элементов того же типа. Ссылка в БД осуществляется через таблицу «многие ко многим». Объект также имеет дискриминатор для создания подклассов (реализации IPoint).

Сначала я сделал простое отображение «многие ко многим» для этого, и все работало хорошо. Но затем я сделал (в качестве советов передовой практики) один ко многим ассоциацию вместо много ко многим в моих отображениях. Для этого я создал новый класс PointLink с Composite-ID , который содержит родительский и дочерний элемент. Но NHibernate не делил подклассы этих дочерних элементов (как это было, когда была ассоциация «многие ко многим»). Он создал свои собственные объекты Proxy (экземпляры IPoint). Похоже, он полностью игнорирует правило подкласса. Но для родительского элемента используется правило подкласса.

Отображение IPoint:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property"  auto-import="true" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="Elgsis.Core.IPoint, Elgsis.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="Points">
<id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
  <column name="Id" />
  <generator class="identity" />
</id>
<discriminator type="String">
  <column name="Type" />
</discriminator>
<property name="Name" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
  <column name="Name" />
</property>
<bag cascade="all" inverse="true" name="Links">
  <key>
    <column name="ParentId" />
  </key>
  <one-to-many class="Elgsis.Core.PointLink, Elgsis.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>
<subclass name="Elgsis.Core.Meter, Elgsis.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" discriminator-value="1" />
<subclass name="Elgsis.Core.Controller, Elgsis.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" discriminator-value="2" />
</class>
</hibernate-mapping>

И отображение связующего объекта PointLink

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="Elgsis.Core.PointLink, Elgsis.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="Points_Points">
<composite-id mapped="false" unsaved-value="undefined">
  <key-many-to-one name="Parent" class="Elgsis.Core.IPoint, Elgsis.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
    <column name="ParentId" />
  </key-many-to-one>
  <key-many-to-one name="Child" class="Elgsis.Core.IPoint, Elgsis.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
    <column name="ChildId" />
  </key-many-to-one>
</composite-id>
</class>
</hibernate-mapping>

Может быть, я должен использовать Class вместо Interface в качестве базового типа, или это не должно быть большой разницей?

Я использую последнюю версию NHibernate 2.1.0.4000 с FluentNHibernate 1.0.0.0

Спасибо!

1 Ответ

2 голосов
/ 05 сентября 2009

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

Хорошо Пост об этом поведении.

...