代码之家  ›  专栏  ›  技术社区  ›  AlexCuse

NHibernate一对多连接子类

  •  0
  • AlexCuse  · 技术社区  · 17 年前

      <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 additionsused0_.RecipeId=@p0; @p0 = '11'
    

    请注意,它是“在子类中查找RecipeId”表,而不是实际包含列的基表。我知道我可以为每个成分类型定义一个单独的表,但这会给我带来问题,因为在某些情况下(即定价),我不需要子类表中的其他列,并且希望能够一次将所有成分加载到同一列表中。

    我肯定我在这里遗漏了什么,我想在这个网站上更熟悉NHibernate的人可能会马上认出它。

    提前谢谢。

    如果我不清楚我要做什么,这个图可能会有所帮助(请原谅我的拙劣UML,希望它不会弄脏水)。还有一个成分基类,以及与之相同的子类型。

    diagram

    1 回复  |  直到 9 年前
        1
  •  1
  •   Diego Jancic    17 年前

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

    在一张纸上创建表格,你会发现如果你想让你的配料有很多添加剂,你需要在添加剂表格中添加一列。