之前从未问过这个问题,我会尽量简洁地说出来。
我有一个食谱类,其中包含三种不同类型的成分用途的列表。这些类都继承自基础的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 Generated时,我看到了:
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 additionsused0_.RecipeId=@p0; @p0 = '11'
请注意,它'在子类'表中查找RecipeId,而不是实际包含该列的基表。我知道我可以为每种成分类型定义一个单独的表,但这会引起我的问题,因为有些情况(即定价)我不需要子类表中的附加列,并且希望能够将所有成分一次加载到同一个列表中。
我确信我必须在这里遗漏一些东西,认为在这个网站上更熟悉NHibernate的人可能会立刻认出来。
提前致谢。
编辑如果我不清楚我要做什么,这个图表可能会有所帮助(请原谅我粗制滥造的UML,希望它不会混淆水域)。还有一个成分基类,以及相同的亚型。
答案 0 :(得分:1)
这是预期的行为,关键标记是“很多”一侧中引用“一”的列的名称...
在纸张中创建表格,您将看到如果您希望您的成分有很多添加项,您需要在添加表中添加一列。
顺便说一句,永远不要直接映射您的ID,而是使用多对一
来映射实体