如果一个顾客具有附接至它们许多订单。你将如何延迟加载使用NHibernate的订单列表。

有什么事情需要被建立映射文件?任何帮助或一个例子将是巨大的。

有帮助吗?

解决方案

下面有一个很好的文章:

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

从上面的文章:

最常见的是简单地标记与“懒惰=‘真’”在映射声明属性或地点“默认-懒惰=‘真’”类:

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

其他提示

克里斯的建议是我怎么会做它,但是如果你想在运行时可以设置Fetchmode您的条件是懒惰像这样做:

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

要懒惰加载的实体的特定集合,可使用“懒=真”的集合映射。例如:

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

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

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