带有连接子类的NHibernate One-To-Many

时间:2009-03-01 06:07:15

标签: .net 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 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,希望它不会混淆水域)。还有一个成分基类,以及相同的亚型。

diagram

1 个答案:

答案 0 :(得分:1)

这是预期的行为,关键标记是“很多”一侧中引用“一”的列的名称...

在纸张中创建表格,您将看到如果您希望您的成分有很多添加项,您需要在添加表中添加一列。

顺便说一句,永远不要直接映射您的ID,而是使用多对一

来映射实体