Nhibernate: Как создать <bag>на двух классах для одного и того же класса ребенка? - PullRequest
0 голосов
/ 15 декабря 2011

У меня есть класс / таблица с именем "Comment"

<class name="Comment">
<id name="Id">
  <generator class="guid"/>
</id>
<property name="ReferenceId" index="Comment_ReferenceId_Index" />
<property name="Contents" length="1024" />

И мне нужно создать пакет комментариев для нескольких других классов, таких как Contract

<class name="Contract">
<id name="Id">
  <generator class="guid"/>
</id>
<property name="Status"/>    
<bag name="Comments">
  <key column="ReferenceId" />
  <one-to-many class="Comment" />
</bag>

Или Приложение:

<class name="Application">
<id name="Id">
  <generator class="guid"/>
</id>
<property name="Status" />
<bag name="Comments">
  <key column="ReferenceId" />
  <one-to-many class="Comment" />
</bag>

Но это отображение дает мне только один внешний ключ, как я могу создать коллекцию, чтобы иметь комментарии к нескольким классам?

Ответы [ 2 ]

1 голос
/ 11 января 2012

Ответ был:

Установите имя внешнего ключа равным "none", и тогда hibernate не создает FK, но отслеживает ссылки.

<class name="Contract">
<id name="Id">
  <generator class="guid" />
</id>
<property name="Status" />    
<bag name="Comments">
  <key column="ReferenceId" foreign-key="none"/>
  <one-to-many class="Comment" />
</bag>
0 голосов
/ 15 декабря 2011

С этим отображением вы получаете один внешний ключ, потому что вы явно настроили его таким образом.<key column="..."> - это один и тот же столбец ReferenceId для обоих родительских классов, это означает, что NHibernate пытается сделать ReferenceId внешний ключ для Application и Contract, и это не может быть сделано.

Самый простой способ - дать вашим ключевым столбцам разные имена, такие как ContractId и ApplicationId.

Если вы пытаетесь создать один столбец ReferenceId, который будет ссылаться либо на Contract, либо Application, но не на оба, вы должны добавить столбец дискриминатора к вашему Contract и сделать <any> отображение - см. Эту статью .

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