2010-07-06 45 views
10

我有兩個類:NHibernate的:「收集沒有被沖洗處理()」所造成的延遲加載問題

class Parent 
{ 
    public virtual Child Child { get; set; } 
} 

class Child 
{ 
    public virtual IList<GrandChild> GrandChildren { get; set; } 
} 

我有Parent實例從我ISession加載,Parent.Child是懶加載(未加載在此刻)。 Child.GrandChildren也是懶加載的。

如果我這樣做:

session.Save(new Parent { Child = existingParent.Child }); 

我得到collection [Child.GrandChildren] was not processed by flush()

如果我造成existingParentChild財產要加載,只需通過訪問:

var x = existingParent.Child.Name 

問題消失遠。爲什麼會發生這種情況,我如何解決它 - 最好不必改變我的抓取策略?

**編輯:**家長有FK到兒童

我用NH 2.1.2.4000

感謝

+0

您是否發現不涉及觸摸集合的修復? – bcsanches 2012-08-14 18:26:45

+0

不這麼認爲:( – 2012-08-14 20:51:28

+0

除非「使用文檔數據庫,而是」計數 – 2012-08-14 20:51:49

回答

0

什麼是級聯設定爲級聯變化從孩子到孫子採集?我認爲如果集合是髒的,NHibernate會拋出這個異常,但級聯設置不會導致更改被持久化。

+0

我沒有做任何改變,因此爲什麼沒有加載? 我只是想創建一個新的'父',與現有的'父'相同的孩子。hasone的級聯是' saveupdate'和hasmany是'alldeleteorphan' – 2010-07-06 17:20:11

+0

您是否正在初始化Child的構造函數中的GrandChildren集合?請顯示映射。 – 2010-07-06 17:23:13

0

您可以使用session.Load來引用Child的現有實例,而無需前往db。這應該這樣做,我想:

session.Save(new Parent { Child = session.Load(existingParent.Child.Id) }); 

但檢查,以確保該.Id通話不會觸發分貝之旅。

1

我有類似的問題,來自@Jamie Ide的評論幫助我意識到問題所在。我正在初始化構造函數中的集合,這使得NHibernate認爲集合是髒的,即使在那個時候不需要保存那個特定的對象。

我得到的例外是: ClassName:ERROR | NHibernate.AssertionFailure:collection [CollectionName]沒有通過flush處理()

我仍然想要做這個初始化,但我想我必須找到其他解決方案來解決這個問題。