2009-12-28 3 views
0

Nhibernate를 파고 들기 시작했습니다. 내가 좋아하는 많은 것들이 있지만, 싫어하는 점이 하나 있습니다 : "프록시 생성"/ 지연로드 메커니즘. 내가 Session에 대한 일종의 참조를 유지하고, 지연로드를 유발할 수있는 속성에 액세스하기 전에 엔티티가 세션과 연관되어 있는지 확인해야한다는 생각은 내가 바라는 것보다 내 viewmodels에서 좀 더 배관된다. 내가 사용한 마지막 ORM 매퍼에서 우리는 느린 로딩에 대한 다른 접근법을 사용하여 적은 POCO 엔티티의 비용으로 세션 문제를 완전히 무시할 수있게했습니다. 기본적으로 내가이와 비슷한 구문, NHibernate에와 같은 일을 할 : 아이디어 컬렉션이 이미로드 된 경우 ormService 단순히 (엔티티에서 게으른로드 요청을 무시하는 것입니다nhibernate는 프록시없이 lazyload 할 수 있습니까?

public class Order 
{ 
    // this will introduced through the ctor using for ex an interceptor and Castle Windsor 
    private IOrmService ormService; 
    List<OrderLine> details = new List<OrderLine>(); 

    public IEnumerable<OrderLine> Details 
    { 
     get 
     { 
      ormService.LazyLoad(this, o => o.Details); 
      return this.details; 
     } 
    } 
} 

국가 관리 문제에 신경 쓰지 마라 .-)). NHibernateUtils 클래스를 살펴 보았습니다. NHibernateUtils 클래스에는 초기화되고 초기화 된 컬렉션 메서드가 있지만 프록시를 사용한다고 가정합니다. 기본적으로, 나는 nhibernate someting을 말하는 것과 같은 방법이 필요합니다. "이봐, 네가주는이 세션에서이 속성을 채워라." 상태 관리 등은 외부에서 처리 할 수 ​​있습니다. Nhibernate에서이 작업을 수행 할 수 있습니까?

답변

1

조금 혼란 스럽네요. 나는 Hibernate 베스트 프랙티스가 충분해야하며 이미 존재하는 것을 다시 발명 할 필요가 없다고 생각한다. 다음은 몇 가지 의견입니다.

나는 ISession 및 을 참조 일부 종류의 실체가 게으른 로딩을 실행할 수있는 속성에 액세스하기 전에 세션과 을 연결되어 있는지 확인을 유지해야하는 아이디어는 좀 더 배관입니다 당신이 open session in view 패턴을 따른다면 내가

감사보다 내 viewmodels ,이 정말 쉬워집니다. 아이디어가 모음이 이미 게으른 프록시가 이미 무엇이다

로드 된 경우 ormService 단순히 기업의 게으른로드 요청을 무시하는 것입니다

. "내가 당신을주는거야이 세션을 사용 이봐, 채우기이 속성을"

는 기본적으로 내가 좋아하는 NHibernate에가 someting을 말하는 방법이 필요합니다.

개체를 세션에 분리하거나 첨부 할 때 수행 할 작업. 게으른 항목은 개체가 첨부 된 세션에 따라로드됩니다.

1

대답은 프록시 없이는 게으른 로딩을 할 수 없습니다. 프록시가 NHibernate에 의해 생성 될 필요가 있거나 당신이 구현 한 클래스 나 패턴이 프록시가 어디서 어떻게 생성되었는지를 제외하고는 같은 최종 결과를 만들어 낼 것입니다.

지연로드가 작동하려면 기본적으로 ISession이 필요합니다. 그렇지 않으면 필요한 값을 검색하기 위해 데이터베이스에 연결할 수 없습니다.

NH가 프록시 패턴을 구현 한 방식은 아마도 .NET 4.0까지 동적 인 단어가 조금씩 흔들릴 때까지 적어도 최고로 달성 할 수 있습니다.

관련 문제