Подкласс NHibernate задачи объединенного подкласса

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

Однако у меня есть проблема с одним из моих новых унаследованных классов. Я настроил карту подклассов, но при сохранении он не пытается сохранить ни одно из свойств своего базового класса, ни какое-либо из его новых, которые я назначил в сопоставлении!

Мои занятия выложены следующим образом: (из небольшого демонстрационного приложения)

Основные сборки DataItem -> Пользователь

Все, что касается базы данных, наследует класс DataItem, поскольку он обрабатывает идентификатор, дату изменения и т. Д. И т. Д.

В моем тесте я настроил пользователя только на FirstName.

Если я сохраняю нового пользователя, он прекрасно работает... однако, когда я наследую от пользователя, а затем добавляю другое свойство с именем LastName и пытаюсь сохранить этот новый объект... он только помещает SQL-оператор вместе из INSERT INTO t_User (id) VALUES(?).. он не пытается сохранить имя или фамилию.., хотя оба были установлены и сопоставлены.

Мой nhibernate.config:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory name="DAL">
    <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="adonet.batch_size">16</property>
    <property name="current_session_context_class">web</property>
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
    <mapping assembly="DAL"/>
    <mapping assembly="NHibernateDemo"/>
  </session-factory>
</hibernate-configuration>

Как вы можете видеть, у меня есть 2 сборки... мой DAL - это мое ядро, а NHibernateDemo - это веб-приложение, которое использует ядро ​​для наследования.

Мое основное отображение DataItem:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DAL" namespace="DAL.Model">
  <class name="DataItem" table="t_DataItem" >
    <id name="Id">
      <generator class="native" />
    </id>
    <discriminator column="typeid" type="System.Int32"></discriminator>
    <property name="IsActive" column="isActive" not-null="true" />
    <property name="TypeId" column="typeId" not-null="true"></property>
    <many-to-one name="Parent" column="ParentId" class="DataItem"></many-to-one>
    <bag name="Children" cascade="all-delete-orphan">
      <key column="ParentId"></key>
      <one-to-many class="DataItem"/>
    </bag>
    <joined-subclass name="User" table="t_Users">
      <key column="id"></key>
      <property name="FirstName" column="firstName" not-null="true" ></property>
    </joined-subclass>
    <joined-subclass name="Email" table="t_Emails">
      <key column="emailid"></key>
      <property name="Address" column="Address"></property>
    </joined-subclass>
  </class>
</hibernate-mapping>

Мое унаследованное отображение NewUser, которое не работает!:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateDemo" namespace="NHibernateDemo.Model">
  <subclass name="NewUser" extends="DAL.Model.User, DAL" discriminator-value="1">
    <property name="LastName" column="LastName"></property>
  </subclass>

Почему при попытке сохранить мой класс NewUser он не пытается сохранить какой-либо другой набор свойств, будь то из его базовых или недавно объявленных свойств?

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

Спасибо,

Майк

1 ответ

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

Другой проблемой может быть использование "дискриминатора" в вашем текущем отображении NewUser. Дискриминатор должен быть дополнительным столбцом в вашей таблице User, который NHibernate использует, чтобы указать разницу между записью User и записью NewUser. Я не уверен, работает ли это там, где базовый класс User может не указывать значение дискриминатора, а NewUser - нет. Я не уверен, указываете ли вы где-нибудь столбец дискриминатора, что также может быть проблемой.

Я бы предложил сначала попытаться сделать NewUser присоединенным подклассом пользователя.

Другие вопросы по тегам