NHibernate - отображение коллекции на основе другого свойства для личности - PullRequest
0 голосов
/ 23 августа 2011

Рассмотрим следующие таблицы:

Client(Id bigint, Name varchar(50))
Employee(Id bigint, Name varchar(50), ClientId bigint)

которые отображаются так:

<class name="Client" table="`Client`">
  <id name="Id" column="`Id`" type="long">
    <generator class="native" />
  </id>
  <property name="Name" column="`Name`" />
  <bag name="Employees" cascade="all" inverse="true" >
    <key column="`ClientId`" />
    <one-to-many class="Employee" />
  </bag>
</class>

<class name="Employee" table="`Employee`">
  <id name="Id" column="`Id`" type="long">
    <generator class="native" />
  </id>
  <property name="Name" column="`Name`" />
  <many-to-one name="Client" cascade="all" column="`ClientId`" />
</class>

Если я получаю клиента, я также получаю коллекцию сотрудников, где Employee.Client = Client.Id. Отлично.

Теперь рассмотрим это:

Client(Id bigint, Name varchar(50), AlternativeId int)
Employee(Id bigint, Name varchar(50), ClientId bigint, AlternativeClientId int)

Я хочу вернуть Клиенту с набором Сотрудников, где Employee.AlternativeClientId = Client.AlternativeId.

Я бы предположил, что ключевой узел теперь будет читать:

<key column="`AlternativeClientId`"/>

Но кроме этого я в тупике. Существуют фильтры, которые можно применять к коллекциям, но набор сотрудников во второй версии может не быть подмножеством сотрудников в первой версии, поэтому я не думаю, что это путь вперед. Я пытался, но это казалось тупиком. Есть ли способ указать запрос, но не только для Сотрудников, у которых есть ClientId = Client.Id?

(Для «почему»: это связано с тем, что разные системы имеют разные представления о данных.)

1 Ответ

2 голосов
/ 24 августа 2011

Я довольно новичок в nhibernate, но это звучит как проблема, возникшая у меня из-за работы с базой данных Brownfield. Атрибут property-ref позволяет ссылаться на столбец, отличный от первичного ключа. Так что в вашем случае это должно быть:

    <key column="AlternativeClientId" property-ref="AlternativeId"/>
...