2008-12-19 61 views
3

我正在使用Castle ActiveRecord編寫一個Web應用程序,並且每當我嘗試訪問延遲加載的相關對象列表時,都會收到此異常。這裏是我的代碼:有關ActiveRecord異常的幫助「無法懶惰地初始化一個集合 - 沒有會話」

 using(new SessionScope()) 
     { 
      foreach (var field in eventObj.RegistrationFields) 
      { 
       //Do something with the field here... 
      } 
     } 

的RegistrationFields屬性看起來是這樣的:

[HasMany(Inverse = true, Lazy = true)] 
    public IList<EventRegistrationField> RegistrationFields { get; set; } 

當 「eventObj.RegistrationFields」 爲foreach循環被訪問時,發生異常。我還確保在我的activeRecord配置設置中設置isweb =「true」屬性。有誰知道爲什麼會發生?這是我的配置:

<connectionStrings> 
    <add name="main" connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=EventScheduler;Integrated Security=SSPI"/> 
</connectionStrings> 
<activerecord isWeb="true"> 
    <config> 
    <add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver"/> 
    <add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2005Dialect"/> 
    <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/> 
    <add key="hibernate.connection.connection_string_name" value="main"/> 
    </config> 
</activerecord> 

回答

6

我認爲你對會話感到困惑。 RegistrationFieldseventObj的懶惰屬性。這是會話加載eventObj,將負責加載RegistrationFields。您正在使用new SessionScope()明確地打開一個新會話,該會話創建了一個未綁定eventObj的新會話;因此它沒有擁有會話來獲取數據。即使原始會話仍然存在,調用new SessionScope()嵌套新會話並隱藏舊會話,直到在當前作用域上調用Dispose()時纔會被看到。對象不會自動附加到當前會話。這是預期的NHibernate行爲。

它看起來像你試圖做會話每工作單元,這是很好,但然後加載對象所有這些對象的懶惰集合的決議必須發生在該單位工作的。

您可以嘗試轉移到會話每請求(請參閱城堡文檔瞭解如何實現此目的)並刪除SessionScope創建。這將使您的對象在頁面請求期間保持活動狀態(只要任何懶惰集合應該存在於Web應用程序中)。但是,您必須意識到,在這種情況下,對持久對象所做的任何更改都將在會話刷新時寫入數據庫(實際上,您應該將對持久對象狀態的更改視爲對基礎的更改數據就好像它們是相同的操作 - 那麼你不會出錯)。

相關問題