1

我有一个应用程序,它有一个核心程序集,其中包含我需要继承的基类。我需要将它们保存到数据库中,并且在阅读了 NHibernate 之后决定使用它。

但是,我的一个新继承类有问题。我已经设置了子类映射,但是当我保存时,它既不会尝试保存它的任何基类属性,也不会尝试保存我在映射中分配的任何新属性!

我的课程布局如下:(来自一个小型演示应用程序)

核心组件 DataItem -> 用户

任何会触及数据库的东西都会继承 DataItem 类,因为它会处理 id、修改日期等。

在我的测试中,我将用户设置为只有一个名字..

如果我保存一个新用户,它会很好用..但是当我从用户继承然后添加另一个名为 LastName 的属性并尝试保存这个新对象时..它只会将 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 是一个使用核心进行继承的 Web 应用程序。

我的核心 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 时它没有尝试保存任何其他属性集,无论是从它的基础属性还是新声明的属性?

我真的很感谢对此的任何帮助或洞察力。我一定错过了一些非常简单的东西,我只是看不到它。

谢谢,

麦克风

4

1 回答 1

1

可能是您无法在同一类层次结构中混合子类和连接子类映射。由于您的 DataItem 和 User 通过joined-subclass 相关联,因此您可能需要将 NewUser 类设为 User 的另一个joined-subclass。

另一个问题可能是在您当前的 NewUser 映射中使用“鉴别器”。鉴别器应该是您的用户表中的一个附加列,NHibernate 使用它来区分用户记录和新用户记录之间的区别。我不确定这是否适用于 User 基类可能未指定其鉴别器值的情况,而 NewUser 则可以。我不确定您是否在任何地方指定了鉴别器列,这也可能是一个问题。

我建议首先尝试使 NewUser 成为用户的加入子类。

于 2009-11-08T22:50:46.453 回答