2010-12-07 41 views
8

我使用NH 3.0和FNH 1.1與NH3重新編譯。NHibernate:無法成功急切加載

我有一個用戶模型,我想在加載時總是檢索它的配置文件。我使用NH3的linq提供程序,但不能使用它的Fetch方法(因爲我的存儲庫隱藏了NHibernate並返回了IQueryable,並且事實上ToPagedList在查詢上被調用,因此阻止我將Fetch作爲查詢的最後一個調用)。

在用戶映射我設置:

HasOne(x => x.Profile) 
    .Not.LazyLoad() 
    .Cascade.All(); 

但設置LazyLoad爲OFF沒有幫助。我也使用了獲取模式。

我的期望是,如果我定義了這個映射,那麼我甚至不需要告訴Linq我希望在請求User實體時獲取Profile。 Linq應該尊重地圖,不是嗎?

+1

嗯...我認爲1對1總是渴望提取...實際上我記得不能延遲加載1對1。 NH3改變了嗎? – dotjoe 2010-12-08 15:31:24

回答

3

我也有這個問題,不幸的是我認爲這是由設計。 NHibernate 3.0 Linq提供程序使用HQL,而HQL在這方面不遵守你的映射。舉例來說,如果你沒有

session.CreateQuery(「從配置文件」)。名單()

你只會得到所有配置文件的列表,甚至如果你的用戶類不入你的映射具有outer-join = true。

如果您正在使用所使用的API性判據老NHibernate.Linq提供商,或標準API直接:

session.CreateCriteria()名單()

你會得到返回所有與用戶連接的外部配置文件列表,就像您的映射文件請求一樣。

現在我不知道爲什麼HQL支持的linq提供程序不尊重映射(如果有人知道解決此問題的方法,請發佈),但我相信這就是爲什麼你會看到這種行爲。