2010-01-08 2 views
7

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; 
     } 
    } 

답변

5

나는 게으른 로딩을하고있는 것으로 나타났습니다. 나는 다음과 같은 매핑했다 :

public class FooMapping : ClassMap<Foo> 
{ 
    public FooMapping() 
    { 
     Not.LazyLoad(); 
     Id(c => c.Id).GeneratedBy.HiLo("1"); 
     Map(c => c.Name).Not.Nullable().Length(100); 
     HasMany(x => x.Bars).Cascade.All(); 
    } 
} 

나는 Not.LazyLoad() 장애인 게으른 로딩 가정을,하지만 분명히하지 참조 객체. 참조에 게으른로드를 추가했는데 문제가 해결 된 것 같습니다.

public class FooMapping : ClassMap<Foo> 
{ 
    public FooMapping() 
    { 
     Not.LazyLoad(); 
     Id(c => c.Id).GeneratedBy.HiLo("1"); 
     Map(c => c.Name).Not.Nullable().Length(100); 
     HasMany(x => x.Bars).Not.LazyLoad(); // <---------- 
    } 
} 

시간 내 주셔서 감사 드리며, 주어진 구조가 합리적인지 여부에 대해 귀하의 의견을 기다리고 있습니다.

-1

xml 파일이 매핑 목적으로 사용되면 bag에 lazy = false를 설정할 수 있습니다.

+0

예제 코드에서 볼 수 있듯이 XML 파일이 매핑에 사용되지 않습니다. 맵핑에 Fluent를 사용하고 있습니까? – stiank81

관련 문제