2010-08-06 60 views
2

當我(從數據庫)請求實例時,我有幾個實體通過FNH配置,以便使用FetchMode.Eager語法加載子實體。現在我的印象是,它會忽略映射中的任何延遲加載,並用「真​​實」數據填充子實體。(流利)Nhibernate延遲加載並影響Parallel.ForEach

爲什麼我想這樣做的原因是因爲我想用一個Parallel.ForEach遍歷實體的集合,產生一組結果,但我得到了以下錯誤:

[18000] System.InvalidOperationException: 
There is already an open DataReader associated with this Command 
which must be closed first. 

如果我使用'NHibernateUtil.Initialize'初始化所有子實體,然後按預期工作。

我錯在我的理解中使用FetchMode.Eager

回答

1

我真的不會嘗試這樣做。每個Parallel.ForEach函數都可以在不同的線程上運行。根據你的配置,NHibernate ISession是針對一個線程存儲的,這意味着調用線程以外的任何東西都不能訪問會話,這就是爲什麼整個事情都失敗了。

就我個人而言,我會將整個事物檢索到一個傳輸對象中,然後對其執行Parallel.ForEach。

+0

我知道這一切,因此使用'NHibernateUtil.Initialize' – AwkwardCoder 2011-03-28 09:05:09

+0

這並不重要。你的對象仍然有代理環繞它們,期望上下文存在,如果你處於不同的線程中,這不是。 – Deleted 2011-03-28 09:22:00

+0

NHibernateUtil.Initialize刪除代理.... – AwkwardCoder 2011-03-28 17:04:01