2009-11-03 8 views
0

프로젝트에 NHibernate를 사용하고 있습니다. 난 꽤 NHibernate에서 일하는 초보자입니다.많은 수의 NHibernate와 ISession.Close()

"사용자"와 "역할"을 다 대다 관계 매핑으로 사용합니다. 이 예외가 발생

public User GetUser(int userId){ 
    using(ISessuib session = new SessionManager().GetSession()) 
    { 
    return session.Get<User>(userId); 
    } 
} 

public void LazyLoadUsingSessionTest(){ 
    var user= GetUser(1); 
    Assert.NotNull(user.Roels); 
} 

: 다음은 사용자가 얻을 수있는 코드 내가 "사용"문을 사용하지 않는 경우 가 유유히 컬렉션을 초기화하지 못했습니다은 어떤 세션이나 세션은

폐쇄되지 않았다 "GetUser"메서드에서 작동합니다. 하지만, 난 만) 인 getUser를 (사용하려면 내가 웹 페이지에서 사용할 때 리소스

을 해제하기 위해 session.Close()를 호출해야하지 ISession 내 질문을 object.so입니다 : 내 웹 페이지에 Resession 객체를 가져야한다는 뜻인가요? 또는 더 나은 솔루션은?

덕분에 (내가 ISession 객체 내 aspx.cs 파일에 나타납니다 싶지 않기 때문에)!

답변

2

을 당신은 요청 패턴 당 세션을 사용할 필요가있다. ASPX와 함께 NHibernate를 사용하는 최상의 방법에 대한 설명은 link을 참조하십시오.

using(ISession session = new SessionManager().GetSession()) 
{ 
    User user = session.Get<User>(userId); 
    NHibernateUtil.Initialize(user.Roles); 
    return user; 
} 

그러나, 조만간 어떻게 든 응용 프로그램에서 세션을 관리해야합니다 (자세한 내용은 here을 읽기)

-1

가장 간단한 방법은 NHibernateUtil.Initialize을 사용하는 것입니다. 데이터베이스에 액세스 할 수있는 데이터 공급자 계층을 만드는 것이 좋습니다. 데이터 공급자 계층은 세션 생성 및 제거를 관리합니다. 요청 당 세션 또는 대화 당 하나의 세션을 가질 수 있습니다 (ASP.Net 세션 기간 동안 단일 세션).

Summer Of NHibernate 비디오 시리즈가 유용 할 것입니다. 세션 5와 13이 가장 관련이 있습니다.

+0

죄송합니다. 그러나 이것은 좋은 조언이 아닙니다. 이렇게하면 게으른 로딩과 트랜잭션 격리를 동시에 파괴 할 수 있으며 많은 쓰레기로 코드를 날려 버릴 수 있습니다. –

관련 문제