2009-06-05 3 views
2

이 질문은이 하나의 중복이 될 수 있습니다NHibernate에서 자동 로딩을 비활성화하는 방법은 무엇입니까?

nhibernate - disable automatic\lazy loading of child records for one to many relationsihps

내가 아이 컬렉션을로드하지하는 NHibernate에 말할 수있는 방법이 있는지 알고 싶습니다 (가장 잘 유창한 NHibernate에 함께 인 경우) 내가 모든 쿼리를 유지하면서 쿼리를 수동으로 수행하지 않는다면!

게으른로드를 끄더라도 컬렉션은 자동으로로드됩니다. 내 쿼리에서 fetchmode를 지정하지 않으면 컬렉션이로드되지 않습니다.

답변

1

링크 된 질문과 답변에서 알 수 있듯이 관계를 단방향으로 만들어이를 정렬 할 수 있습니다. 그래서 대신 에 직접 대답하는 대신을 묻습니다. 은 왜인데 더 나은 방법으로 가려고합니다.

나는 항상 컬렉션을 열심히 가져 오기를 원하지 않는다는 것을 분명히 알기 때문에 NHibernate가 게으른 로딩을하는 이유가된다. (그리고 프리 페치하지 않는 한 NHibernate가 항상 콜렉션을로드하는 이유) Hibernate는 실제로 당신이 그것을 요구할 때까지 실제로 그 콜렉션을 가져 오지 않을 것이다. 그래서 내 질문은 NHibernate 당신이 그것을 따라 작업 할 때 컬렉션을로드하지 않으시겠습니까? 엔티티에서 자식 컬렉션에 접근 할 때 NHibernate가 무엇을하기를 원합니까?

업데이트 :

당신은 정말 이유 (아마 난 그냥 고집하고 있습니다)하지만, 잘, 당신이 컨트롤을 원하는 내 질문에 대답하지 않았다. NH이 그 일을하지 못하도록하는 가장 간단한 방법은 처음부터 NH가 그렇게하지 않도록 지시하는 것입니다 (즉, 매핑하지 마십시오). 즉, 관계의 "많은"(콜렉션) 끝을 맵핑하지 마십시오. 클래스에 컬렉션을 유지할 수 있지만 NHibernate에 매핑 파일에 추가하여 NHibernate에 채우라고하지 않은 한 결코 컬렉션을 유지할 수 없습니다. 그런 다음 PopulateCollection 메소드를 어딘가에 추가하여 NH 쿼리를 실행하고 해당 콜렉션에 결과를 저장할 수 있습니다. 당신은 NHibernate가 컬렉션에 대해 제공하는 모든 멋진 의미를 잃는다. 왜냐하면 변경 사항을 추적 할 수 없기 때문이다. 당신은 당신 자신의 Add와 Remove 메소드를 구현해야 할 것이다.

그래서 David Kemp의 대답은 다른 질문입니다.

+1

이유는 간단합니다.로드되는 내용과 그렇지 않은 내용을 수동으로 제어하려고합니다. 후드 아래에서 데이터베이스로 질의하는 것을 원하지 마십시오. 또한 디버깅하는 동안 엔티티가로드되지 않도록하는 것이 매우 짜증나게됩니다. 로드되지 않은 컬렉션에서 작업 할 경우 null 예외가 발생할 것으로 예상됩니다. – Drevak

관련 문제