4

我有一個映射到名爲規則的表的實體。該實體的表有一個FK到另一個名爲Category的表。我試圖弄清楚如何在我的Rule實體中從類別中提取屬性。我很確定我想在我的實體映射中使用連接,但我無法弄清楚如何配置它以使其可用。這裏是我的映射:流利的nHibernate加入

Join("Category", x => 
{ 
    x.Map(i => i.CategoryName, "Name"); 
    x.KeyColumn("CategoryId"); 
    x.Inverse(); 
}); 

這裏是它生成SQL ...

SELECT ... 
FROM Rule rules0_ left outer join Category rules0_1_ on rules0_.Id=rules0_1_.CategoryId 
WHERE ... 

這裏是我想要的SQL。

SELECT ... 
FROM Rule rules0_ left outer join Category rules0_1_ on rules0_.CategoryId=rules0_1_.Id 
WHERE ... 

我似乎無法在JoinPart上找到任何可以讓我這樣做的東西。子選擇看起來很有希望從我找到的一點文檔,但我找不到任何如何使用它的例子。任何有關這個問題的建議將不勝感激。謝謝!

回答

6

「加入」名稱很差。 NHibernate映射中的「連接」意味着基於兩個表的主鍵關係的零對一關係。例如,如果您有一個用戶表和一個UserAdditionalInfo表,並且每個用戶有零個或一個記錄,則可以使用聯接。 UserAdditionalInfo表可能引用來自用戶的PK作爲外鍵和它自己的主鍵。當DBA必須宗教地維護傳統應用程序的模式時,這種情況很常見,但是新的應用程序需要同一概念記錄的新字段。

你實際需要的是你的情況是一個引用關係,其中一條記錄有一個外鍵關係爲零或一個其他記錄。你可以像下面這樣流利地設置它:

References(x=>Category) 
    .Column("CategoryId") 
    .Inverse() 
    .Cascade.None(); 

這樣做的問題是Category現在必須被映射;它是一個現在與你有關的獨立實體。你的選擇是接受這個模型,通過使實體引用變爲私有,改變映射來訪問實體,以及將「傳遞」編碼到你想要公開的屬性,或者通過使用代碼來「扁平化」像AutoMapper這樣的工具,可以在運行時將這個深層域模型投影到一個扁平的DTO中,以供常規使用。他們都有優點和缺點。

+0

嗯...所以這聽起來像加入不是爲我的特殊情況工作。爲了澄清我的關係,我有一對多的關係,我想把一個方面(類別)的財產拉到我的「多方」(規則)中。是的,我想過使用引用映射引入整個Category實體(我已經映射過),但我真正想要的只是一個屬性,所以我試圖讓它看上。可能只是優化一些並不需要它的東西。感謝您的反饋意見! – 2011-06-15 14:04:32