2010-01-13 78 views
1

我的Object1類型的對象包含List Children1屬性。 我很想得到這些沒有孩子的物體。NHibernate:如何獲取沒有其子集合的對象?

好像detachedCriteria.SetFetchMode(「Children1」,FetchMode.Lazy)應該是一回事, 但顯然它不是:( 我嘗試使用(新SessionScope()),並設置爲null,.Children1獲取數據但沒有成功(數據已經獲取)。

任何想法,將不勝感激。

+0

問了幾天後,我「解決了」問題,但忘了在這裏寫下來。我設置了criteria.SetFetchMode(「Children1」,FetchMode.Eager) 2)當我想要懶惰行爲時,我設置了criteria.SetFetchMode(「Children1」 ,FetchMode.Lazy),然後我FindAll(條件)我的對象我設置null爲Children1列表屬性。 我不確定所有這些技巧都是必要的,但我不在乎了。 – wysek 2010-02-23 11:20:34

回答

0

當你映射集合,你指定不使用延遲加載?試着在這一點上,指定延遲加載

+0

我沒有指定任何東西,所以默認值適用,但我不知道什麼是默認值。 順便說一句,問題是「解決」。我會在幾分鐘內添加評論。 – wysek 2010-02-23 11:14:18

0

我們在當前的解決方案中遇到同樣的問題d設置懶惰的映射不起作用。我們必須將default-lazy設置爲true,並突然使用。

如果所有的關係在默認情況下都應該是懶惰的,這將會最好。

+0

好的,我已經在HasMany屬性上設置了Lazy = true,現在它工作, ,但在其他(更頻繁)使用情況下,我需要急切加載... 我寧願有急切的加載默認和懶需求, ,但如果這太複雜了...我會嘗試修復那些其他用例(現在我得到LazyInitializationException ...未能懶惰地初始化角色集合...沒有會話或會話被關閉) – wysek 2010-01-13 13:08:12

+0

你會得到這個例外,因爲你的會話已經關閉,就像消息所說的那樣。您需要將您的會話注入到repository/dataaccess類中,並從外部控制會話生存期。 您希望會話持續整個請求生命週期,特別是如果您有延遲加載。 我們在我們的mvc控制器上使用了UnitOfWork屬性來啓動和關閉一個會話,如果拋出任何nhibernate異常,它就會停止並且會話被回滾 – Henning 2010-01-13 13:30:44

0

當使用的ICriteria API來獲取你的實體,您可以指定(覆蓋)必須被用於協會fetchmode:

ICriteria crit = session.CreateCriteria (typeof(MyEntity)); 
crit.SetFetchMode ("someAssociationPath", FetchMode.Lazy); 
+0

我試過了。你真的讀過我的問題嗎? ;) 順便說一句,問題是「解決」。我會在幾分鐘內添加評論。 – wysek 2010-02-23 11:12:01

0

在我看來,您正在使用一對一一個映射。在這種情況下,延遲加載不會按設計工作。如果是這樣,請檢查this article。否則,請提供更多的代碼和映射。

+0

爲什麼你認爲你是一對一的映射?當Object1有列表我認爲很明顯它至少是一對多的。 順便說一句,問題是「解決」。我會在幾分鐘內添加評論。 – wysek 2010-02-23 11:13:43

+0

@wysek,你沒有提供任何代碼,所以我只是從我的角度出發考慮了最可能的原因。對不起,我不太在意讀書。 – zihotki 2010-02-23 14:41:18