题
如果一个顾客具有附接至它们许多订单。你将如何延迟加载使用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 );
不过,我不知道这是否是您的情况是可行的。
不隶属于 StackOverflow