2009-03-01 74 views
0

從來沒有問過這裏的一個問題,我會盡量簡潔地說明這一點。NHibernate一對多連接子類

我有一個食譜類,其中包含三種不同類型的成分用途列表。這些類都從基礎IngredientUse繼承。所以映射如下所示:

<class name="IngredientUse" table="IngredientUses"> 
    <id name="Id" type="Int64" column="Id"> 
     <generator class="native"/> 
    </id> 
    <!--some other properties--> 
    <property name="RecipeId" column="RecipeId"/> 
    <joined-subclass name="AdditionUse" table="AdditionUses"> 
     <key column="Id" foreign-key="FK_AdditionUses_IngredientUses"/> 
     <many-to-one name="AdditionUsed" column="AdditionUsed" class="Addition" foreign-key="FK_AdditionUses_Additions"/> 
    </joined-subclass> 
    </class> 

這裏引起問題的是RecipeId。從配方,我有不同的成分類型的用途,像這樣定義的三個不同的列表:

<bag name="AdditionsUsed" cascade="all" lazy="false"> 
    <key column="RecipeId"/> 
    <one-to-many class="AdditionUse"/> 
</bag> 

現在,我遇到了問題試圖加載這些列表。它與繼承有關。當我看到生成的SQL,我看到:

SELECT additionsused0_.RecipeId as RecipeId1_ 
--other columns not really important 
FROM AdditionUses additionsused0_ 
inner join IngredientUses additionsused0_1_ 
on additionsused0_.Id=additionsused0_1_.Id 
WHERE [email protected]; @p0 = '11' 

公告稱,其尋找在子類中的RecipeId表中,而不是在列實際上包含基表。我知道我可以爲每種成分類型定義一個單獨的表格,但是這會導致我的問題,因爲在某些情況下(即定價),我不需要子類表中的額外列,並且希望能夠一次加載所有成分到同一個列表中。

我確定我必須在這裏丟失一些東西,認爲有人更熟悉NHibernate在這個網站上可能會認出它的權利。

在此先感謝。

編輯:如果我不清楚我想做什麼,這張圖可能有幫助(原諒我的僞劣UML,希望它不會渾水)。還有一個成分基類,以及相同的亞類。

diagram

回答

1

這是預期的行爲,關鍵標籤是在「多」方列,爲「一」引用...

在一份文件中創建表的名稱,你會發現如果你想讓你的配料有很多添加,你需要在添加表中添加一列。

順便說一句,從來不讓IDS直接映射,而不是使用多到一個

+0

多數民衆贊成的東西,我不想映射到AdditionUse表映射實體,我想映射到Ingredient使用表格,使用AdditionUse作爲過濾器和額外信息。我想我需要放棄NHibernate,或者重新思考我的表是如何設置的。感謝您的迴應。 – AlexCuse 2009-03-01 14:57:57