문제

이것은 웹 애플리케이션 환경에 있습니다.

초기 요청은 성공적으로 완료 될 수 있지만 추가 요청은 nhibernate 프레임 워크에서 "세션이 닫힌"응답을 반환합니다. 다음 코드와 함께 httpmodule 접근 방식을 사용하고 있습니다.

public class MyHttpModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.EndRequest += ApplicationEndRequest;
        context.BeginRequest += ApplicationBeginRequest;
    }

    public void ApplicationBeginRequest(object sender, EventArgs e)
    {
        CurrentSessionContext.Bind(SessionFactory.Instance.OpenSession());
    }

    public void ApplicationEndRequest(object sender, EventArgs e)
    {
        ISession currentSession = CurrentSessionContext.Unbind(
            SessionFactory.Instance);

        currentSession.Dispose();
    }

    public void Dispose() { }
}

sectionfactory.instance는 issessionfactory 객체를 반환하기 위해 fluentnhibernate를 사용하는 싱글 톤 구현입니다.

저장소 클래스에서 다음 구문을 사용하려고합니다.

public class MyObjectRepository : IMyObjectRepository
{
    public MyObject GetByID(int id)
    {
        using (ISession session = SessionFactory.Instance.GetCurrentSession())
            return session.Get<MyObject>(id);
    }
}

이렇게하면 응용 프로그램의 코드가 다음과 같이 호출 될 수 있습니다.

IMyObjectRepository repo = new MyObjectRepository();
MyObject obj = repo.GetByID(1);

저장소 코드가 비난하는 것이 의심 스럽지만 사용해야 할 실제 구현에 대해서는 100% 확신하지 못합니다.

나는 비슷한 문제를 발견했다 여기. 저도 구현에서 WebsessionContext를 사용하고 있지만 사용자 정의 세션 관리자를 작성하는 것 외에는 해결책이 제공되지 않았습니다. 간단한 CRUD 작업의 경우 내장 도구 (예 : WebSessionContext)와는 별도로 사용자 정의 세션 제공 업체가 필요합니까?

도움이 되었습니까?

해결책

나는 당신의 코드를 테스트하지 않았지만 읽기 에서이 줄은 다음과 같습니다.

using (ISession session = SessionFactory.Instance.GetCurrentSession())

블록 출구 후 세션을 버린 다음 다음에 세션이 배치/유효하지 않습니다.

우리가 응용 프로그램에서 사용하는 모델은 다음과 같습니다.

ISession session = null;

try
{
    // Creates a new session, or reconnects a disconnected session
    session = AcquireCurrentSession();

    // Database operations go here
}
catch
{
    session.Close();
    throw;
}
finally
{
    session.Disconnect();
}

다른 팁

비슷한 오류가 발생했습니다. 내 IOC 컨테이너를 해결하는 대신 저장소를 "새로운"것으로 밝혀졌습니다.

다음 명령문의 사용은 모든 쿼리 후 세션을 꺼내거나 닫습니다.

using (ISession session = SessionFactory.Instance.GetCurrentSession())

대신 "사용"단어없이 사용하십시오.

ISession session = SessionFactory.Instance.GetCurrentSession()

이것은 나를 위해 효과가있었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top