2011-01-27 7 views
0

asp.net mvc telerik ajaxグリッドでNhibernateセッションを閉じた例外が発生しました。グリッドは、関連エンティティUserを持つエンティティセールにバインドされます。スローされる例外は、Userエンティティにアクセスしようとするときです。私はeetchにfetchModeを使用していますが、同じ例外が発生します。この例外は、グリッドページを複数回切り替える場合にのみ発生します。誰でもこの問題が発生しましたか?Nhibernateセッションが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

Userオブジェクトによって参照されるオブジェクトの1つが遅延してロードされる可能性はありますか?例えば、ユーザは、熱心に取り出されなかったLocale/Addressオブジェクトを参照します。また、どのようなタイプのセッション管理モデルを使用していますか(つまり、リクエストごとのセッションなど)? – saret

+0

@Saret:私はcodesmithテンプレート1.7テンプレートを使用しています。これはリクエストごとにセッションが作成されます。 – odez213

答えて

1

これは、ユーザーが遅延ロードされているために発生している可能性があります。 Userオブジェクトがロードされる前にセッションが閉じられています。グリッドがUser参照にアクセスすると、この例外が発生します。 Unit of Work patternに従っていることを確認してください。

また、エンティティではなくグリッドにバインドするために、Modelクラスを使用することもできます。このようにして、どのようなアクセスが行われ、エンティティ/データベースに予期しない変更が発生するのを防ぐことができます。

+0

@ Yads:それは私がそれが怠惰に読み込まれているのを見ているものです。私のパズルは私のicriteriaをfetchMode.EagerをユーザEntityに設定することです。私はそれを熱望するために私の呼び出しを洗い流す必要がありますか?また、あなたの答え – odez213

+0

@ odez213に対して+1、FetchModel.Eagerは外部結合を介してUserエンティティをフェッチします。生成されたSQLが何であるか確認できますか?アクセスされているUserオブジェクトに遅延ロードされた参照が存在する可能性はありますか? – Vadim

+0

@ Yads実際にはtelerikグリッド上のページングをクリックしようとすると例外が発生します。ページングの最初の初期化と適度なクリック時間は問題ありません。 TelerikグリッドはAjaxを使用しています。この問題は本番環境で発生しており、私はdevの問題を再現できます。私はこれがtelerikグリッドajax呼び出しに関連していると思っています。私はいくつかのコードと例外メッセージを後で投稿します。 – odez213

関連する問題