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 中加载没有重复的多级集合

如何将应用程序设置加载到 NHibernate.Cfg.Configuration 对象?

Fluent NHibernate - 用新的 List<object> 子对象保存新的父对象

与 first()/all() 链接时,Laravel Eager 加载缺失的关系

Hibernate中load()和get()的区别,lazy加载和Eager加载的区别

NHibernate 完全填充部分加载的集合