2012-07-10 2 views
0

우리는 nHibernate의 Session 기능을 감싸는 NCommon의 UnitOfWorkScope를 사용하고 있습니다. 우리의 목표는 요구에 따라 복잡한 속성을 열심히로드하는 것보다 구성을 통해 항상 열심히로드하는 것입니다. 개념은 엔티티를 검색하는 특정 서비스가 호출 코드에 의해 조금만 사용자 정의 될 수 있다는 것입니다. 때로는 상위 엔티티 만 수화되기를 원할 때도 있고 복잡한 자식 속성을 수화시키는 다른 시간을 원할 수도 있습니다.nHibernate Eager 런타임에 로딩

이를 위해, 우리가하고있는 다음

그 설정이 세션에의하면, 우리는 엔티티 검색 n 일반적인의 IRepository 기능을 사용
var iSession = unitOfWorkScope.CurrentUnitOfWork<NHUnitOfWork>().GetSession<ParentEntity>(); 

    iSession.CreateCriteria<ParentEntity>().SetFetchMode("Children", FetchMode.Eager); 

: 때, 그러나

var parent = parentRepository.FirstOrDefault(x => x.Id == 123); 

을 부모님 확인. 우리가 얻은 어린이 수집 :

NHibernate.Collection.Generic.PersistentGenericBag<ChildEntity> 

... 나는 열렬한 적재가 발생하지 않았습니다. 열성적인로드를 항상 강요하도록 NH 맵핑을 수정할 때, 우리는 아이들을 올바르게 봅니다.

누구든지이 문제에 관해 밝힐 수 있습니까? FetchMode.Eager가 무시 된 이후에 뭔가 빠졌다고 가정합니다.

+1

죄송합니다, 당신은 왜 열망 로딩을 가정하는 것은 발생하지 않았다? NHibernate가 가방에 사용하는 클래스입니다. –

+0

Children 속성이 채워지지 않으므로. config를 통해 Eager 로딩을 구성 할 때 우리는 항상 채워진 Children 콜렉션을 얻습니다. 그러나 우리가 Session에서 FetchMode를 통해 런타임에 그것을하려고 할 때, 액세스 할 때 LazyInitializationException을 던지는 PersistentGenericBag를 얻습니다. – znelson

+0

NH의 Session.Query ()은 CreateCriteria() 호출을 통해 세션에서 이미 생성 된 기준을 준수하지 않는 것으로 보입니다. 나는 Query()가 호출되었을 때 존중받을 것이라고 생각했지만 분명히 ... ??? – znelson

답변

0
+0

결국 우리는 EagerFetch 솔루션에 반대하기로 결정했습니다. LazyLoading을 허용하고 UnitOfWorkScope를 서비스 계층에서 비즈니스 계층으로 이동시켜 접근 방식을 단순화했습니다. 또한 NServiceBus를 사용하는 경우 IsolationLevel.Serializable을 사용하여 DB 처리에서 ReadCommitted를 사용하려는 경우 작동하지 않는 앰비언트 트랜잭션이 생성된다는 사실을 잊지 마십시오. ReadCommitted를 사용하도록 NSB를 구성해야하며 모든 것이 만족 스럽습니다. – znelson

관련 문제