NHibernate: Отображение объединения на объединенном столе - PullRequest
0 голосов
/ 28 июля 2011

У меня есть представление, объединяющее 3 таблицы в цепочку, которую мне нужно заменить отображением NHibernate без каких-либо изменений в базе данных. Это возможно? Это упрощенный пример моего взгляда:

SELECT tblTable1.*,tblTable2.*,tblTable3.MyProperty FROM tblTable1
OUTER JOIN
tblTable2 ON tblTable1.Table1Key = tblTable2.Table1Key
OUTER JOIN
tblTable3 ON tblTable2.Table2Key = tblTable3.Table2Key

поэтому мы выбираем tblTable1 и присоединяемся к tblTable2, это работает для меня в NHibernate. Моя проблема tblTable3. Как мне присоединить его к свойству из объединенной таблицы tblTable2?

Когда я делаю сопоставление таким образом, я получаю запрос, пытающийся присоединиться к tblTable3 на Table1Key по какой-то причине.

<class name="MyClass" table="tblTable1">

<id name="Table1Key">
  <generator class="identity"/>
</id>

<property name="..." />

<join table="tblTable2">
  <key column="Table1Key" />

  <property name="..." />
</join>

<join table="tblTable3">
  <key column="Table2Key???" />

  <property name="..." />
</join>

</class>

Ответы [ 2 ]

1 голос
/ 28 июля 2011

в NH вы не можете присоединиться к объединению. единственный способ - сделать это ссылкой, что в основном делает то же самое

<class name="MyClass" table="tblTable1">
  <id name="Table1Key">
    <generator class="identity"/>
  </id>

  <property name="..." />

  <many-to-one table="tblTable2" lazy="false">
    <key column="Table1Key" />

    <property name="..." />
  </many-to-one>
</class>

<class name="MyClass2" table="tblTable2">

  <join table="tblTable3">
    <key column="Table2Key" />

    <property name="..." />
  </join>
</class>

class MyClass
{
    public virtual MyClass2 MyClass2 { get; set; }

    public virtual int MyClass2_MyProperty
    {
        get { return MyClass2.MyProperty; }
        set { MyClass2.MyProperty = value; }
    }
}

class MyClass2
{
    public virtual int MyProperty { get; set; }
}

Изменить вариант 2: если вы не хотите MyClass2 Может быть, вы можете настроить это:

<class name="MyClass" table="tblTable2">    <-- take table2 as the main table
  <id name="Table1Key">
    <generator class="sequence">  <-- can be problem here, use sequence (directly) instead?
      <param name="sequencename">table1_id_squence</param> // not sure about "sequencename"
    </generator>
  </id>

  <property name="..." />

  <join table="tblTable1">
    <key column="Table1Key" />

    <property name="..." />
  </join>

  <join table="tblTable3">
    <key column="Table2Key" />

    <property name="..." />
  </join>
</class>
0 голосов
/ 28 июля 2011

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

  <join table="tblTable2">
    <key column="Table1Key" />
    <property name="Table2Key" />
  </join>
  <join table="tblTable3">
    <key property-ref="Table2Key" />
    <property name="..." />
  </join>
...