我有一个视图将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的属性上加入它?
当我像这样进行映射时,由于某种原因,我得到一个尝试在Table1Key上加入tblTable3的查询。
<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>
答案 0 :(得分:1)
您无法加入加入。唯一的方法是使它成为一个参考,它基本上做同样的事情
<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>
答案 1 :(得分:0)
没试过,但也许你可以在第二次加入时定义一个属性,在第三次加入中使用property-ref作为键列
<join table="tblTable2">
<key column="Table1Key" />
<property name="Table2Key" />
</join>
<join table="tblTable3">
<key property-ref="Table2Key" />
<property name="..." />
</join>