2011-07-28 148 views
0

我有一個視圖將3個表連接在一起,我需要用一個NHibernate映射來替換,而不需要對數據庫進行任何更改。這可能嗎? 這是我的看法的一個簡單的例子:NHibernate:在連接表上映射連接

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

所以basicaly我們選擇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> 

回答

1

在NH你不能加入一個連接。唯一的辦法就是讓它的引用,basicly做同樣的事情

<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

謝謝,我會試試這個。但是,我必須爲聯合表格設置一個單獨的類別嗎?我不能只是映射到現有類的屬性? –

+0

我沒有得到它與同一類(我不知道我是否完全理解你的例子),但現在它在一個子類中工作正常,這已經足夠好了。謝謝! –

0

沒有嘗試這個,但也許你可以定義一個屬性在你的第二次加入使用屬性ref在你的第三次加入中的鍵列

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

我試過這個,但property-ref似乎對查詢沒有任何影響...... –