如果客户附加了许多订单。你将如何使用NHibernate延迟加载订单列表。
是否需要设置映射文件?任何帮助或一个例子都会很棒。
答案 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 );
但是,我不知道这对你的情况是否可行。