2011-01-27 2 views
0

asp.net mvc telerik ajax 표로 Nhibernate Session 예외가 발생했습니다. 그리드는 관련 엔티티 User가있는 엔티티 Sale에 바인딩됩니다. throw되는 예외는 User 엔터티에 액세스하려고 시도 할 때 발생합니다. 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

사용자 개체가 참조하는 개체 중 하나가 느리게로드 될 수 있습니까? 예를 들어, 사용자는 열심히 가져올 수없는 Locale/Address 객체를 참조합니다. 또한 어떤 유형의 세션 관리 모델을 사용하고 있습니까 (즉, 요청 당 세션 수 등 ...)? – saret

+0

@Saret : 코드 스틱 템플릿 1.7 템플릿을 사용하고 있는데 요청 당 세션이 생성됩니다. – odez213

답변

1

사용자가 게으르고로드되고있는 상황이 발생할 가능성이 높습니다. 사용자 객체가로드되기 전에 세션이 닫힙니다. 그런 다음 Grid가 User 참조에 액세스하면이 예외가 발생합니다. Unit of Work pattern을 따르고 있는지 확인하십시오.

또한 Model 클래스를 사용하여 엔티티가 아닌 그리드에 바인딩 할 수 있습니다. 그렇게하면 어떤 종류의 액세스가 이루어지는지를 제어 할 수 있으며 엔티티/데이터베이스에 예기치 않은 변경이 발생하는 것을 방지 할 수 있습니다.

+0

@ Yads : 그것이 게으르다는 것을 알게되었습니다. 내 수수께끼는 사용자의 Entity에 fetchMode.Eager를 갖도록 내 빙산을 설정 한 것입니다. 열심히로드하려면 내 전화를 플러시해야합니까? +1 – odez213

+0

@ odez213, FetchModel.Eager는 외부 조인을 통해 User 엔티티를 가져옵니다. 생성 된 SQL이 무엇인지 확인할 수 있습니까? 액세스중인 User 객체에 지연로드 된 참조가 있습니까? – Vadim

+0

@ 옐로우는 telerik 그리드에서 페이징을 정말로 빨리 클릭하려고하면 예외가 발생합니다. 페이징을 처음 초기화하고 적당한 시간 동안 클릭하면됩니다. Telerik 그리드는 Ajax를 사용하고 있습니다. 프로덕션 환경에서이 문제가 발생하며 dev에서 문제를 재현 할 수 있습니다. 나는 이것이 telerik 그리드 ajax 호출과 관련이 있다고 생각하기 시작했다. 나중에 몇 가지 코드와 예외 메시지를 게시 할 것입니다. – odez213