2011-01-05 5 views
3

HI, 나는 내가 NHibernate에 세션에 액세스 할 때마다 내가 전화 저장소를 내 NHibernate에 응용 프로그램 에서 사용자 지정 역할 공급자를 구현하고asp.net 사용자 지정 역할 공급자 NHibernate에 오류

.

그래서 내 역할 공급자는 그때 필터링하고 //

public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) { 

      base.Initialize(name, config); 
      Repository = new Repository(); 
     } 

가 그럼 난

public override string[] GetRolesForUser(string username) { 
     var users = Repository.QueryAll<Users>(); 

를 오버라이드 (override) 자체를 초기화 할 때 너무

} 

그러나이 함수가 호출되고 I에 항상 NHibernate 세션이 닫힌다는 에러를 얻는다. nhibernate 소스 코드를 디버깅했는데 여기에있는 세션이 내 컨트롤러의 세션과 다른 GUID를 가지고 있음이 드러났습니다 (ASP.NET MVC도 사용하고 있습니다). 그리고이 특정 세션은 내가 여기 올 때까지 닫힙니다. 누구를 닫을 지 모르겠습니다. 나는 응용 프로그램이 시작될 때 시작된다는 것을 알고 있습니다.

내가 뭘 잘못하고 있는지 알 수있는 사람이 있습니까? 이 공급자에서 여전히 Nhibernate를 사용하려고하지만 더 이상 오류를 얻지는 않습니다. 감사합니다.

+0

세션 관리 전략은 무엇입니까 :

public Repository() { this.Session = SessionManager.GetCurrentSession(); } 

은 내가이 대신에 넣어 생성자 완전히 을 삭제? –

+0

application_start에서 세션 팩토리를 시작하고 저장소 생성자에서 큐어 세션을 얻습니다. – Para

+0

언제, 어디서 세션을 열고 닫습니까? –

답변

1

이것은 내가이를 분명히 고쳤던 방법입니다. 내 저장소 클래스

내가이 있었다 :

private ISession _session; 
     protected ISession Session 
     { 
      get 
      { 
       if (_session == null) 
       { 
        _session = SessionManager.GetCurrentSession(); 
       } 
       return _session; 
      } 
     } 
2

정확히 같은 문제가있는 것으로 보입니다. 역할 및 멤버 자격 공급자는 한 번만 인스턴스화되며 응용 프로그램의 수명 동안 존재한다는 것을 잊지 마십시오. 웹 당 세션 요청 패턴을 사용하는 경우, 첫 번째 요청 후에 ISession이 닫히고 공급자 내부의 ISession에 대한 참조는 후속 요청에 대해 null이 될 가능성이 큽니다.

ISessionFactory에 대한 참조를 주입하고 ISession에 대한 참조를 직접 보유하는 대신 GetCurrentSession을 호출하여이 문제를 해결할 수 있습니다.

관련 문제