this question에서 NHibernate 세션 수명에 대해 물어 보았습니다. 나는 데스크톱 애플리케이션을 사용하고 있지만 클라이언트/서버 분리로 인해 서버 측에서 모든 NHibernate 매직이 발생하므로 서버 요청마다 하나의 세션을 사용하게됩니다.서비스를 사용하여 NHibernate 세션 수명을 처리하는 방법은 무엇입니까?
내 문제는 어떻게 처리할까요? 세션이 중간에 닫힐 때 참조 된 데이터로드로 problems before을 가졌습니다.
기본 {NHibernate.HibernateException} = { "[# 14 MyNamespace.Foo] 초기화가 실패했습니다 : 따라서 참조 데이터가 아직로드하지 않는 경우 - 문제를 디버깅 할 때 나는 내 참조 클래스에서 다음을 볼 수 있다는 것입니다 지연된 역할 모음을 초기화하는 중 : MyNamespace.Foo.Bars, 세션 또는 세션이 닫히지 않았습니다. "}
트랜잭션을 커밋해도 모든 항목이로드되지 않습니다. 그래서 나는 잠시 동안 내 세션을 열어야한다는 것을 알았지 만, 얼마나 오래?
제 질문은 근본적으로 평생을 제대로 처리하고 있는지, 올바른 길을 가기 위해 바꿔야 하는지를 묻는 것입니다. 솔직히 나는 이것이 어떻게 잘못 될 수 있는지를 볼 수 없다. 그래서 나는 정말로 참조 된 데이터를 가져 오기위한 함수 호출을 원한다. 나는 이 아니고, 게으른 로딩을 사용하는입니다. 그래서 나는 그들이 즉시로드 될 것이라고 생각했습니다.
현재 아키텍처 : 트랜잭션을 수행하는 "서비스 동작"클래스 사용. 이것은 IDisposable이므로 서비스 자체에서 사용 조항을 사용합니다. NHibernateSessionFactory는 정적 팩토리를 제공하기 때문에 다시 사용될 것이다.
// This is the service - the function called "directly" through my WCF service.
public IList<Foo> SearchForFoo(string searchString)
{
using (var serviceBehavior = new FooServiceBehavior(new NhibernateSessionFactory()))
{
return serviceBehavior.SearchForFoo(searchString);
}
}
public class FooServiceBehavior : IDisposable
{
private readonly ISession _session;
public FooServiceBehavior(INhibernateSessionFactory sessionFactory)
{
_session = sessionFactory.OpenSession();
}
public void Dispose()
{
_session.Dispose();
}
public IList<Foo> SearchForFoo(string searchString)
{
using (var tx = _session.BeginTransaction())
{
var result = _session.CreateQuery("from Foo where Name=:name").SetString("name", searchString).List<Name>();
tx.Commit();
return result;
}
}
예제 코드에서 볼 수 있듯이 XML 파일이 매핑에 사용되지 않습니다. 맵핑에 Fluent를 사용하고 있습니까? – stiank81