2009-03-01 79 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