在NHibernate中加载延迟

时间:2009-03-16 22:03:37

标签: nhibernate lazy-loading

如果客户附加了许多订单。你将如何使用NHibernate延迟加载订单列表。

是否需要设置映射文件?任何帮助或一个例子都会很棒。

5 个答案:

答案 0 :(得分:7)

Chris的建议是我如何做到这一点,但是如果你想在运行时这样做,你可以将你的标准上的Fetchmode设置为懒惰,如下所示:

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

答案 1 :(得分:4)

这是一篇好文章:

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" >

答案 2 :(得分:2)

要延迟加载实体的特定集合,请在集合映射上使用“lazy = true”。例如:

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

答案 3 :(得分:1)

这里的所有答案都是正确的,但是如果有这么多订单,那么migth也想要使用过滤器,这样你就不必加载所有这些。

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

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

答案 4 :(得分:1)

您是否希望Customer实体拥有包含其所有订单的属性? 我认为这可能是一个非常大的集合 我想,你要问自己的问题是:
我需要多少次直接访问客户订单?

也许,在这种情况下,您不希望进行双向关联?也许您不希望在Customer类中拥有Orders集合 然后,我将向Order Repository添加一个方法,该方法具有以下签名:

IList<Order> GetOrdersForCustomer( Customer c );

但是,我不知道这对你的情况是否可行。