Множественные сопоставления соединений в NHibernate

#c# #nhibernate #nhibernate-mapping

#c# #nhibernate #nhibernate-сопоставление

Вопрос:

Первый вопрос по Stackoverflow.

После использования соединения для сопоставления свойства я пытаюсь использовать это свойство для другого соединения из третьей таблицы. Проблема в том, что в сгенерированном SQL второй оператор JOIN использует правильный столбец, но из исходной таблицы, а не из второй таблицы.

Вот сопоставление —

  <class name="Core.Domain.NetHistoryMessage, Core" table="NHistoryIN" >
<id name="ID">
  <column name="ID"/>
  <generator class="assigned"/>
</id>     
<property name="RecipientDuns" unique="true">
  <column name="Recipient" unique="true"/>
</property>
<join table="DunsSites" optional="true" fetch="select">
  <key column="Duns" property-ref="RecipientDuns" />
  <property name="RecipientID" column="SiteID" unique="true" lazy="false"/>
</join>
<join table="Components"  optional="true" >
  <key column="ComponentID"   property-ref="RecipientID" />
  <property name="RecipientName" column="ComponentName" unique="true" lazy="false"/>
</join> 
 

Сгенерированный SQL —

 SELECT this_.*, this_1_.SiteID as SiteID7_0_, this_2_.M_SNAME as M3_11_0_ 
FROM RNTransactionHistoryIN this_ 
left outer join DunsSites this_1_ on this_.Recipient=this_1_.Duns 
left outer join Components this_2_ on this_.SiteID=this_2_.ComponentID
 

Мне нужен следующий SQL —

 SELECT this_.*, this_1_.SiteID as SiteID7_0_, this_2_.M_SNAME as M3_11_0_ 
FROM RNTransactionHistoryIN this_ 
left outer join DunsSites this_1_ on this_.Recipient=this_1_.Duns 
left outer join Components this_2_ on this_1_.SiteID=this_2_.ComponentID
 

Я использую NHibbernate 3.2.

Спасибо

Комментарии:

1. Являются ли компоненты отношением 1: 1 или 1: M NetHistoryMessage ?

Ответ №1:

я пробовал то же самое, но так и не смог заставить его работать. <join> предназначен для объединения только из исходной таблицы, а не каскадного. лучше объявить DunsSite как сущность и использовать <join> оттуда для компонентов. затем вы можете ввести удобные свойства в NetHistoryMessage.

 public string ComponentName
{
    get { return DunsSite.ComponentName; }
    set { DunsSite.ComponentName = value; }
}
 

Комментарии:

1. Я стараюсь избегать использования этой опции, потому что сложно выполнить запрос к свойству ComponentName.

2. тогда представление базы данных было бы лучше для этого

3. Вы правы, и это решило бы мою насущную проблему, но я считаю, что эта возможность должна быть интегрирована в NHibernate. Если у меня есть «коричневое поле», и я должен создать обновляемый объект, я не мог бы использовать сопоставление моего объекта с представлением.

4. у меня был проект brown field с множеством таких вещей. Там у меня было сочетание удобных свойств, подобных показанным выше, и явных ссылок, и у меня не было никаких проблем. Я думаю, что для этого недостаточно, иначе это было бы реализовано