2010-10-18 97 views
2

我有一個NHibernate對象,它是一個超類(我們稱之爲「超級」),還有一個從它繼承的子類(比方說它叫做「Sub」)。Nhibernate映射問題:類型爲超類的屬性

<class name="Super" table="SuperThings"> 
    <id name="Id" type="System.Int32" column="SuperId"> 
     <generator class="identity" /> 
    </id> 

    <joined-subclass name="Sub" table="SubThings" extends="Super" lazy="true"> 
     <key column="SubId" /> 
    </joined-subclass> 
</class> 

我有一個單獨的類(稱爲「小工具」)與屬性類型超級。

<class name="Widget" table="Widgets" lazy="true"> 
    <id name="Id" type="System.Int32" column="NoteId"> 
     <generator class="identity" /> 
    </id> 
    <many-to-one name="SuperProperty" column="SuperId" class="SuperClass" /> 
</class> 

當我在一個Widget實例訪問超性質,NHibernate的嘗試懶洋洋地加載它,但我得到這個錯誤:

More than one row with the given identifier was found: 1, for class: Super

有在SuperThings只有一條記錄爲1的ID ,以及與其關聯的SubThings中的單獨記錄。在使用NHibernate Profiler並調試我的代碼後,它看起來像NHibernate試圖實例化一個類型爲子類的對象。

爲什麼這樣做?我是如何認爲這應該被映射的?

顯然,這是我實際工作的簡化版本。我正在使用的對象具有更多不同類型的屬性,所以也許我已經排除了實際導致問題的原因,但我想確保至少在基本級別上理解事情。

回答

2

如果在SuperThings中有一個Id = 1的記錄,而SubThings中有一個記錄的SubId = 1,根據你的映射,你有一個Sub實例持久化,所以NHibernate是正確的,當它試圖實例化它。

如果這不是你想要的,你應該重讀Chapter 8. Inheritance Mapping來查看替代方案。