2011-01-27 75 views
0

我得到Nhibernate會話關閉異常與asp.net mvc telerik ajax網格。網格綁定到具有相關實體User的實體Sale。拋出的異常是當試圖訪問用戶實體時。我已經使用fetchMode來加載它,但我仍然得到相同的異常。如果我多次在網格頁面之間切換,則只會發生此異常。任何人遇到此問題?Nhibernate Session關閉異常問題與Asp.net mvc telerik ajax網格

用於數據訪問的代碼如下:

public IList<Sale> List() 
     { 
      var manager = new ManagerFactory().GetSaleManager(); 
      var iCriteria = manager.Session.GetISession().CreateCriteria(typeof(Sale)) 
       .SetFetchMode("AspnetUser3.Agents3", FetchMode.Eager); 

      return iCriteria.List<Sale>(); 
     } 

試圖訪問對象圖中的相關對象的代碼如下:

AgentId = sale.AspnetUser3.Agents3[0].Id, 

拋出的異常

NHibernate.Exceptions.GenericADOException: could not load an entity: [SalesEntry.Data.Model.AspnetUser#7aaabf99-d77d-4edf-b949-9c4c0f3e85d8][SQL: SELECT aspnetuser0_.[UserId] as column1_12_0_, aspnetuser0_.[UserName] as column2_12_0_, aspnetuser0_.[LoweredUserName] as column3_12_0_, aspnetuser0_.[MobileAlias] as column4_12_0_, aspnetuser0_.[IsAnonymous] as column5_12_0_, aspnetuser0_.[LastActivityDate] as column6_12_0_, aspnetuser0_.[ApplicationId] as column7_12_0_ FROM [dbo].[aspnet_Users] aspnetuser0_ WHERE aspnetuser0_.[UserId]=?] ---> System.ObjectDisposedException: Session is closed! 
Object name: 'ISession'. 
+2

是否有可能由用戶對象引用的對象之一被加載懶惰?例如,用戶引用一個沒有被提取的Locale/Address對象。您還使用了什麼類型的會話管理模型(即每個請求的會話等)? – saret 2011-01-27 14:19:37

+0

@Saret:我正在使用一個codesmith模板1.7模板,它是根據請求創建會話的。 – odez213 2011-01-27 15:28:52

回答

1

這是因爲用戶正在懶加載,你很可能看到一種情況,其中se在用戶對象加載之前ssion正在關閉。然後當網格訪問用戶引用時,你會得到這個異常。確保你正在關注Unit of Work pattern

另外,您可能希望使用Model類綁定到您的網格,而不是直接綁定到實體。通過這種方式,您可以控制完成哪種訪問,並避免對實體/數據庫進行意外更改。