2009-11-08 85 views
1

我有一个应用程序,它具有需要继承的基类的核心程序集。我需要将这些保存到数据库,并在阅读完有关NHibernate后决定使用它。连接子类问题的NHibernate子类

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

我的类的布局类似如下:(从一个小的演示应用程序)

核心组件 的DataItem - >用户

任何能接触到数据库继承的DataItem类,因为它处理的ID ,修改日期等等等等。

在我的测试我设置用户只能有一个姓..

如果我保存它的伟大工程新的用户。但是,当我从用户继承,然后添加其他PR operty调用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

这可能是因为您无法在同一类层次混合子和连接子类的映射。由于您的DataItem和User是通过连接子类关联的,因此您可能需要使NewUser类成为User的另一个连接子类。

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

我会建议首先尝试使NewUser成为用户的联合子类。

+0

也许我误解了单词'joined'的用法。这是否表明它将尝试在说出选择查询时尝试进行连接?我的新用户类将其数据保存在与用户类相同的表中..有一个类型ID,但它属于dataitem ..我看到可能是一个问题。 我会尝试你的建议!感谢您的指导。 – mike 2009-11-08 23:13:42

+0

好吧..我只是试图切换我的NewUser映射是一个用户的联合子类,它仍然尝试保存到我的用户表与以下“INSERT INTO t_Users(id)VALUES(?)..所以它不是试图保存名字或姓氏属性.. – mike 2009-11-08 23:16:58