例如,假設我有兩個表格,Product
和Order
。產品有ID
,Name
,Description
, Cost
等詳細欄目。訂單有ID
和ProductID
列(假定訂單隻能包含一個產品)。是否有可能用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和名稱,而不必再次訪問數據庫。
我不清楚這是否適用於JOIN。個別惰性屬性似乎更適用於從特定行加載選擇數據。我更感興趣的是檢索與一行相關的一小組數據,但不是完整的相關記錄。聽起來像我將不得不與我自己的查詢(這是一個恥辱,因爲這是我想在多個表格上遵循的模式)。 – Travis
@ Travis:這就是懶惰屬性。你定義了一些需要延遲加載的列。你有另一個選擇(雖然真的很難看):你可以映射一個表格兩次,所以你有一個全套的列和唯一一個縮減集。你決定使用哪一個:'.Inner.JoinAlias(()=> orderLine.ProductReducedSet,()=> product)' – LeftyX
我已經用更具體的例子更新了這個問題。 – Travis