문제
고객이 많은 주문이 첨부 된 경우. 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 );
그러나 이것이 당신의 상황에 대해 이것이 가능한지 모르겠습니다.