NHibernate Eager 加载多级子对象
Posted
技术标签:
【中文标题】NHibernate Eager 加载多级子对象【英文标题】:NHibernate Eager loading multi-level child objects 【发布时间】:2010-10-08 11:23:03 【问题描述】:我有一个对象层次结构,订单、联系人、地址:
public class Order
public virtual Contact BillingContact get; set;
public class Contact
public virtual Address Address get; set;
我想通过 id 查询订单,并急切地加载 billingcontact 及其地址。
var criteria = DetachedCriteria.For<Order>()
.SetFetchMode("BillingContact", FetchMode.Eager)
此标准急切地加载 BillingContact,但可以理解的是不加载 BillingContact 的地址。如果我添加:
.SetFetchMode("BillingContact.Address", FetchMode.Eager)
这无济于事。
还要注意这些关系是单向的:
public OrderMap()
References(x => x.BillingContact)
.Not.Nullable()
.Cascade.All();
public ContactMap()
HasOne(x => x.Address)
.Cascade.All()
.FetchType.Join();
public AddressMap()
Map(x => x.Address1);
如何构造一个标准对象来加载孩子的孩子?这些关系映射看起来正确吗?
【问题讨论】:
【参考方案1】:我相信您可能需要为 BillingContact 添加一个别名以允许您访问它的地址。
类似:
var criteria = DetachedCriteria.For<Order>()
.CreateAlias("BillingContact", "bc")
.SetFetchMode("BillingContact", FetchMode.Eager)
.SetFetchMode("bc.Address", FetchMode.Eager)
【讨论】:
以上是关于NHibernate Eager 加载多级子对象的主要内容,如果未能解决你的问题,请参考以下文章
如何将应用程序设置加载到 NHibernate.Cfg.Configuration 对象?
Fluent NHibernate - 用新的 List<object> 子对象保存新的父对象
与 first()/all() 链接时,Laravel Eager 加载缺失的关系