如果客户有许多附加到他们的订单。您将如何使用 NHibernate 延迟加载订单列表。
是不是需要设置映射文件?任何帮助或示例都会很棒。
克里斯的建议是我会怎么做,但是如果你想在运行时这样做,你可以将你的标准上的 Fetchmode 设置为惰性,如下所示:
criteria.SetFetchMode("Orders", FetchMode.Lazy)
这是一篇好文章:
http://blogs.chayachronicles.com/sonofnun/archive/2007/03/30/230.aspx
从上面的文章:
最常见的是简单地用 'lazy="true"' 属性标记类或在映射声明中放置 'default-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" >
要延迟加载实体的特定集合,请在集合映射上使用“lazy=true”。例如:
<bag name="EmploymentHistory" cascade="all" inverse="true" lazy="true">
<key column="PersonID" />
<one-to-many class="MyDomain.EmploymentRecord, MyDomainAssembly" />
</bag>
这里的所有答案都是正确的,但如果有这么多订单,您可能还想使用过滤器,这样您就不必加载所有这些。
客户客户 = session.CreateCriteria(...) .SetFetchMode("订单", FetchMode.Lazy) .UniqueResult<客户>(); Ilist<Order> 订单 = session.CreateFilter(customer.Orders," WHERE this.OrderDate < ?") .SetDateTime(...).List();
您是否希望 Customer 实体具有包含他所有 Orders 的属性?我认为这可能是一个相当大的集合。
我认为,您必须问自己的问题是:
我真正需要多少次才能直接访问客户的订单?
也许,在这种情况下,您不想进行双向关联?也许您不想在 Customer 类中有 Orders 集合。
然后,我将向我的订单存储库添加一个方法,该方法具有以下签名:
IList<Order> GetOrdersForCustomer( Customer c );
但是,我不知道这是否适合您的情况。