4

如果客户有许多附加到他们的订单。您将如何使用 NHibernate 延迟加载订单列表。

是不是需要设置映射文件?任何帮助或示例都会很棒。

4

5 回答 5

7

克里斯的建议是我会怎么做,但是如果你想在运行时这样做,你可以将你的标准上的 Fetchmode 设置为惰性,如下所示:

criteria.SetFetchMode("Orders", FetchMode.Lazy)
于 2009-03-16T22:12:35.830 回答
5

这是一篇好文章:

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" >
于 2009-03-16T22:08:10.443 回答
2

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

<bag name="EmploymentHistory" cascade="all" inverse="true" lazy="true">
  <key column="PersonID" />
  <one-to-many class="MyDomain.EmploymentRecord, MyDomainAssembly" />
</bag>
于 2009-03-16T22:25:16.953 回答
1

这里的所有答案都是正确的,但如果有这么多订单,您可能还想使用过滤器,这样您就不必加载所有这些。

客户客户 = session.CreateCriteria(...)
              .SetFetchMode("订单", FetchMode.Lazy)
              .UniqueResult<客户>();

Ilist<Order> 订单 = session.CreateFilter(customer.Orders," WHERE this.OrderDate < ?")
                      .SetDateTime(...).List();
于 2009-03-16T23:32:01.427 回答
1

您是否希望 Customer 实体具有包含他所有 Orders 的属性?我认为这可能是一个相当大的集合。
我认为,您必须问自己的问题是:
我真正需要多少次才能直接访问客户的订单?

也许,在这种情况下,您不想进行双向关联?也许您不想在 Customer 类中有 Orders 集合。
然后,我将向我的订单存储库添加一个方法,该方法具有以下签名:

IList<Order> GetOrdersForCustomer( Customer c );

但是,我不知道这是否适合您的情况。

于 2009-04-01T07:55:58.723 回答