2009-03-01 18 views
0

これまでに質問したことはありませんでしたが、私はできるだけ簡潔にこれをレイアウトしようとします。NHibernate 1対多と結合サブクラス

私は、3種類の成分使用のリストを含むレシピクラスを持っています。これらのクラスはすべて、ベース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> 

ここで問題を引き起こすのは、レシピIDです。私はこれらのリストをロードしようとしている問題に実行しているよ、今

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

:レシピから、私はそうのように定義された異なる成分の種類の用途、の3つの別々のリストを持っています。それは相続と関係があります。その列が実際に含まれているベーステーブルテーブルサブクラスでRecipeIdを探して、およびないことを

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' 

は注意してください:私は生成されたSQLを見てみると、私はこれを参照してください。私は各成分タイプごとに別々のテーブルを定義することができますが、サブクラステーブルに追加のカラムを必要としない状況(価格設定)があり、一度にすべての成分を同じリストにロードします。

私はここで何かを逃しているに違いないと確信しています。このサイトのNHibernateに詳しい方は、バットからすぐにそれを認識するかもしれません。

ありがとうございます。

編集:場合私は私がやろうとしているかについて明確ではありませんでした、この図は助けて(私の手抜きUMLを言い訳、それが水を濁っていない願っています)があります。 Ingredientの基底クラスもあり、同じサブタイプもあります。予想される動作です

diagram

答えて

1

、キータグは、「1」への言及...

が紙にテーブルを作成することを「多」側の列の名前です。あなたの原料に追加がたくさんある場合は、追加テーブルに列を追加する必要があります。ところで

、代わりのもの厥に-1多

+0

使用してエンティティをマッピングし、直接あなたのIDをマップすることはありません、私はAdditionUseテーブルにマップしたくない、私はにマップしますIngredientUseテーブル.AdditionUseをフィルタと追加情報として使用します。私はNHibernateを放棄する必要があるか、テーブルの設定方法を再考する必要があります。応答していただきありがとうございます。 – AlexCuse

+0

いいえ、NHは正常に動作する必要があります。複雑なドメインモデルでは作業していません。テーブルの作成ではなく、オブジェクトの設計をやり直す必要があります。 あなたがしたいことをすべて理解しているのかどうかはわかりませんが、を削除して、バッグ内のクラスを "IngredientUse"に変更してください。 –

+0

多分私は厚いだけですが、私はそれが私が行きたいところに私を連れて行くとは思わない。 I.Useのサブクラスは、それぞれ固有のデータと振る舞いを持っています。もし私がバッグのタイプをI.Useに変更すると、私はそれをすべて失います。私は簡単にそれを吸うとSQLを書くことができたときに私に作るために大きな犠牲のように見えます。 – AlexCuse

関連する問題