Подкласс 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 присоединенным подклассом пользователя.