2008-08-28 11 views
5

나는 NHibernate (그것으로 나의 첫번째 큰 프로젝트)를 처음 사용한다.
코드 블록을 종료 한 후 세션이 파괴 된 방식으로 내 Object 또는 Object 목록을 가져 오기 위해 using 블록 내에서 ISession 객체를 생성하여 간단한 데이터 액세스 방법을 사용했습니다.NHibernate에서 세션을 관리하는 가장 좋은 방법은 무엇입니까?

그러나 이것은 지연로드가 필요한 상황에서는 작동하지 않습니다.
예를 들어, Orders 컬렉션 인 속성을 가진 Customer 개체가있는 경우 지연로드가 시도 될 때 최대 절전 모드 예외가 발생합니다.
다른 사람이 사용하는 사람이 있습니까?

답변

6
+0

몇 달 후에 메모를 남깁니다. 여전히 위의 방법을 사용하고 있지만 대부분 IOC 도구를 사용하여 ISession 및 ISessionFactory를 관리하는 사람들이하는 재미있는 작업이 있습니다. StructureMap 및 FubuMvc를 확인하는 것이 좋습니다. 자세한 정보는 프로젝트를 참조하십시오. –

+1

@Matt : 성 NHibernate 시설을 살펴보십시오. 몇 년 전부터 있습니다. http://www.castleproject.org/container/facilities/trunk/nhibernate/index.html –

+0

답변의 링크가 오래되었다 . –

1

전체 작업 단위에 대해 세션을 열어 두십시오. 세션의 수명이 너무 짧으면 세션 레벨 캐시의 이점을 누릴 수 없습니다 (중요한). 데이터베이스에 대한 왕복을 막을 수 있으면 언제든지 많은 시간을 절약 할 수 있습니다. 또한 이해하기에 중요한 게으른로드를 활용할 수 없습니다.

세션 수명이 너무 긴 경우 다른 문제가 발생할 수 있습니다.

웹 응용 프로그램 인 경우 http-session-per-http 패턴을 사용하면 문제가 없을 것입니다. 기본적으로 이것은 요청 시작시 세션을 열고 끝에 플러시/닫기하는 HttpModule입니다. 세션을 HttpContext.Items에 저장해야합니다. 정적 변수가 아닙니다. < --- 처리하고 싶지 않은 모든 종류의 문제가 발생합니다.

작업 단위 구현을 위해 RhinoCommons을 볼 수도 있습니다. 좋은 튜토리얼에 대한 SummerOfNHibernate 웹 캐스트 밖으로

+0

웹 응용 프로그램을위한이 세션 관리 방법에 대한 많은 예제를 보았지만 winforms와 함께 작동시키는 것은 다른 이야기입니다. Billy McCafferty는 최선을 다하지만 winforms에서 그의 프레임 워크를 사용하는 방법에 대한 조언을 제공하지 않습니다. 특히, 언제 시작하고 winforms에서 트랜잭션을 플러시. –

2

검사는 ... 특별히 찾고있는 무슨 일이 오지 않는 웨비 소드 5 또는 6