1

我遇到FluentNhibernate公式映射問題。我需要在公式中使用連接表中的列。FluentNhibernate公式映射與來自已加入表的參數

問題是表現出以下三個表:市人,地址

class Person { 
    int PersonId { get; set; } 

    int AddressId { get; set; } 

    Address PersonAddress { get; set; } 

    string CityName { get; set; } 
} 

class Address {  
    int AddressId { get; set; } 

    string Street { get; set; } 
} 

class AddressMap<Address> { 
    Id(x => x.AddressId, "ADDRESS_ID"); 

    Map(x => x.Street, "STREET"); 
} 


class PersonMap<Person> { 
    Id(x => x.Id, "PERSON_ID"); 

    References(x => x.PersonAddress).Column("ADDRESS_ID); 

    Map(x => x.CityName).Formula("select Name from City c where c.street = STREET"); 
    // Doesn't work, STREET is a part of the joined table ! 
} 

不知道如何正確地寫公式映射?當我使用的值 NHibernate的會產生改寫的映射,這樣就可以了,不過,這是很骯髒的解決方案:

Map(x => x.CityName).Formula("select Name from City c where c.street = address1_.STREET"); 
// Works !! 

希望得到任何幫助!

回答

1

還有沒有直接在NHibernate中如何支持別名的另一個加入表。爲什麼?

因爲加入表根本就沒有必須的一部分,加入

想想延遲加載地址 - 即不是SELECT的一部分,或者沒有地址表中的一些預測。

公式的目的是作爲一個聰明或更聰明方式,如何在當前訪問數據。或者如何創建一些獨立的子查詢,子查詢..並通過當前id,作爲參考過濾器。

E.g.在這裏,在Ayende的NHibernate property Mapping,我們可以看到:

<property name="CountOfPosts" 
    formula="(select count(*) from Posts where Posts.Id = Id)"/> 

生成SELECT是這樣的:

SELECT ... 
     // the injected 'Id' is from current table 
     (select count(*) from Posts where Posts.Id = this_.Id) 
FROM [MainTable] this_ // the alias of current table 

建議:City或城市名稱可能是簡單的另一個參考(如果不是直接的字符串屬性地址)。它可以讓我們很容易地處理它(選擇,投影,過濾,排序),我們不會依賴於某些「隱藏的,硬編碼的」映射。這將是乾淨的模型:

Person.Address.City.Name