NHibernate один-ко-многим с присоединенным подклассом - PullRequest
0 голосов
/ 01 марта 2009

Никогда раньше не задавал вопрос здесь, я постараюсь изложить это максимально кратко.

У меня есть класс Recipe, который содержит списки трех разных типов использования ингредиентов. Все эти классы наследуются от базового, 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 на этом сайте, может сразу же узнать это.

Заранее спасибо.

edit: на случай, если мне непонятно, что я пытаюсь сделать, эта диаграмма может помочь (извините за мой дурацкий UML, надеюсь, что он не мутит воду). Существует также базовый класс Ingredient и те же самые подтипы.

diagram

1 Ответ

1 голос
/ 01 марта 2009

Это ожидаемое поведение, ключевой тег - это имя столбца на стороне «многие», который ссылается на «один» ...

Создайте таблицы на бумаге, и вы увидите, что если вы хотите, чтобы у вашего ингредиента было много дополнений, вам нужно будет добавить столбец в таблицу дополнений.

Кстати, никогда не сопоставляйте свои идентификаторы напрямую, вместо этого сопоставьте сущность, используя много-к-одному

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...