2010-12-09 24 views
1

我有一個網站。本網站位於特定的時區,並具有指定類型的Internet連接。這兩個屬性都作爲外鍵存儲在數據庫的Site表中,以記錄到單獨的查找表中。我永遠不會這樣做,但我明白爲什麼(強制使用一組通用名稱,給出稍小的數據庫大小,在某些情況下允許標準化的附加信息,並且允許輕鬆檢索值列表以用作DDL)。另一個流利的NH加入問題

我正在構建一個映射,必須包含這些信息的檢索。我想避免必須爲一個字段構建一個域對象和映射(在某些情況下,除了查找表的ID以外),所以我想要使關係非規範化,只需要對象上的字符串值。簡單的目標。

問題是,我試圖使用的連接假定Site表的主鍵在查找表的某處引用;實際上,我們假設網站位於關係的「一方」,這是不準確的。以下是相關的映射線:

Id(x=>x.Id).Column("SiteID"); 

... 

Join("lu_TimeZone", j => 
{ 
    j.KeyColumn("TimeZoneID"); 
    j.Map(x => x.TimeZone).Column("TimeZone"); 
}); 

生成的SQL包括聯接:

FROM Site this_0_ 
inner join lu_TimeZone this_0_1_ 
    on this_0_.SiteID=this_0_1_.TimeZoneID 

*蜂鳴器*對不起,這是不正確,感謝玩。在加入應該是:

FROM Site this_0_ 
inner join lu_TimeZone this_0_1_ 
    on this_0_.TimeZoneID=this_0_1_.TimeZoneID 

但是似乎有沒有辦法告訴流利使用KeyColumn作爲列名上的連接兩側。由於從站點到其他查找表有多個連接,反轉映射以將TimeZone加入站點是不可行的。

回答

0

作爲墓誌銘,我最後做的兩件事情之一:

  • 對於那些有可能永遠是利益只有一個字段的表,我創建鍵表中的ID枚舉,並使用自定義類型將它們映射爲Enums。

  • 對於可能存在多個值的表,我創建並映射了一個域對象。

無論如何無需將子表引用爲對象,就可能無法像上面描述的那樣獲得聯接行爲的工作。