문제

고객이 많은 주문이 첨부 된 경우. nhibernate를 사용하여 주문 목록을 어떻게 게으른로드하겠습니까?

매핑 파일을 설정 해야하는 것입니까? 모든 도움이나 예는 좋을 것입니다.

도움이 되었습니까?

해결책

여기에 좋은 기사 :

http://blogs.chayachronicles.com/sonofnun/archive/2007/03/30/230.aspx

위 기사에서 :

가장 일반적인 것은 매핑 선언에서 'lazy = "true"속성 또는 배치'기본 Lazy = "True"로 클래스를 표시하는 것입니다.

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="@core.assembly@"
 default-access="nosetter.camelcase-underscore" default-lazy="true">

또는

<class name="Cei.eMerge.Core.Domain.Contacts.Contact" table="Contact" lazy="true" >

다른 팁

Chris의 제안은 내가하는 방법이지만, 런타임에 그것을하고 싶다면 기준에서 FetchMode를 게으른 것처럼 설정할 수 있습니다.

criteria.SetFetchMode("Orders", FetchMode.Lazy)

게으른 엔티티 컬렉션을 게으른로드하려면 컬렉션 매핑에 "Lazy = true"를 사용하십시오. 예를 들어:

<bag name="EmploymentHistory" cascade="all" inverse="true" lazy="true">
  <key column="PersonID" />
  <one-to-many class="MyDomain.EmploymentRecord, MyDomainAssembly" />
</bag>

여기의 모든 답변은 정확하지만 주문이 너무 많으면 필터를 사용하고 싶어하므로 모든 필터를로드 할 필요가 없습니다.

Customer customer = session.CreateCriteria(...)
              .SetFetchMode("Orders", FetchMode.Lazy)
              .UniqueResult<Customer>();

Ilist<Order> orders = session.CreateFilter(customer.Orders," WHERE this.OrderDate < ?")
                      .SetDateTime(...).List();

고객 엔티티에 모든 주문이 포함 된 재산이 있기를 원하십니까? 나는 이것이 상당히 큰 컬렉션 일 수 있다고 생각합니다.
나는 당신이 스스로에게 물어봐야 할 질문은 다음과 같습니다.
고객의 주문에 직접 액세스해야합니까?

아마도이 경우 양방향 협회를 원하지 않습니까? 아마도 당신은 고객 수업에서 주문 컬렉션을 원하지 않을 것입니다.
그런 다음 주문 저장소에 메소드를 추가 할 것입니다. 여기에는 다음과 같은 서명이 있습니다.

IList<Order> GetOrdersForCustomer( Customer c );

그러나 이것이 당신의 상황에 대해 이것이 가능한지 모르겠습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top