2011-08-05 71 views
0

例如,假設我有兩個表格,ProductOrder。產品有ID,Name,Description, Cost等詳細欄目。訂單有IDProductID列(假定訂單隻能包含一個產品)。是否有可能用NHibernate熱切地加載一個外來的自然鍵?

當在系統中顯示訂單列表時,我還想顯示相關的產品名稱,而不包含所有其他數據(即,急切地加載訂單及其關聯的產品名稱,並且延遲加載所有其他數據產品屬性):

SELECT o.ID, o.ProductID, p.Name FROM Order o JOIN Product p ON o.ProductID=p.ID 

如果我這樣做與NHibernate,我有兩個選擇:渴望加載或延遲加載。

隨着預先加載,我得到的是這樣的:

SELECT o.ID, o.ProductID, p.ID, p.Name, p.Description, p.Cost, p.... FROM Order JOIN Product p ON o.ProductID=p.ID 

懶加載,我得到的是這樣的:

SELECT o.ID, o.Product ID from Order 
.... 
SELECT p.Name, p.Description, p.Cost, p.... FROM Product p WHERE p.ID=? 

更新

下面是一個更具體的例子我正在努力實現的目標。我正在使用現有的DAL並嘗試集成NHibernate。當前DAL的功能之一是它允許檢索一些基本的外鍵信息作爲父記錄的一部分。假設有一個User表和一個Region表。每個用戶都有一個到他們所在地區的外鍵。在GUI中顯示用戶信息時,區域名稱應與用戶一起顯示,但有關該區域的其他詳細信息不是必需的。

在當前的DAL中,User域對象具有ForeignKeyReference<Region>類型的成員。

public class ForeignKeyReference<T> 
{ 
    public virtual int ForeignKeyID { get; set; } 
    public virtual string ForeignNaturalKey { get; set; } 
    public virtual T Reference { get; set; } 
} 

User被從數據庫中檢索,對於Region初級和天然鍵也檢索,且Reference被設置爲代理對象。我想用NHibernate簡化這個,但仍然保持這個功能。例如,我想刪除ForeignKeyReference<Region>成員,並且只有一個Region成員,它是NHibernate代理。在這個代理上,我希望能夠檢索ID和名稱,而不必再次訪問數據庫。

回答

0

您可以將特定列標記爲懶惰。 Ayende wrote去年關於這個新功能。

我建議你閱讀Hibernate文檔瞭解這項功能,雖然:

Hibernate3的單獨的屬性支持延遲抓取。這種優化技術也稱爲提取組。請注意, 這主要是一種營銷功能;優化行讀取比列讀取的優化更重要 。但是,只有在加載 時,某些類的某些屬性在極端情況下可能會有用。例如,對於 示例,當傳統表格有數百列時,數據 模型無法改進。

的另一種方法是creare自己的查詢:

Session.CreateQuery 

看一看這個answer

+0

我不清楚這是否適用於JOIN。個別惰性屬性似乎更適用於從特定行加載選擇數據。我更感興趣的是檢索與一行相關的一小組數據,但不是完整的相關記錄。聽起來像我將不得不與我自己的查詢(這是一個恥辱,因爲這是我想在多個表格上遵循的模式)。 – Travis

+0

@ Travis:這就是懶惰屬性。你定義了一些需要延遲加載的列。你有另一個選擇(雖然真的很難看):你可以映射一個表格兩次,所以你有一個全套的列和唯一一個縮減集。你決定使用哪一個:'.Inner.JoinAlias(()=> orderLine.ProductReducedSet,()=> product)' – LeftyX

+0

我已經用更具體的例子更新了這個問題。 – Travis

相關問題