2009-11-08 46 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