NHibernate:在连接表上映射连接

本文关键字:连接 映射 NHibernate | 更新日期: 2023-09-27 18:03:52

我有一个视图在一个链中连接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中对我有用。我的问题是table3。我如何连接它的属性从连接表table2 ?

当我这样做映射时,我得到一个查询,试图将table3连接到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>

NHibernate:在连接表上映射连接

在NH中你不能加入一个join。唯一的方法是使其成为引用,这基本上是相同的事情

<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>

没有尝试过,但也许你可以在第二个连接上定义一个属性,并在第三个连接中使用property-ref作为键列

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