NHibernate一个Joined-Subclass问题的子类

时间:2009-11-08 21:50:45

标签: nhibernate subclass joined-subclass

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

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

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

核心组件 DataItem - >用户

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

在我的测试中,我将用户设置为只有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是一个使用核心进行继承的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时,它不会尝试保存任何其他属性集,无论是从它的基础还是新声明的属性?

我真的很感激对此有任何帮助或见解。我一定很遗憾,我只是看不到它。

谢谢,

麦克     

1 个答案:

答案 0 :(得分:1)

可能是您无法在同一个类层次结构中混合子类和连接子类映射。由于您的DataItem和User与join-subclass相关,您可能需要使NewUser类成为User的另一个join-subclass。

另一个问题可能是在当前的NewUser映射中使用“discriminator”。鉴别器应该是您的用户表中的一个附加列,NHibernate用它来表示用户记录和NewUser记录之间的区别。我不确定这是否适用于用户基类可能没有指定其鉴别器值,而NewUser确实如此。我不确定你是否在任何地方指定了鉴别器列,这可能也是一个问题。

我建议首先尝试使NewUser成为User的连接子类。