Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NHibernate Eager loading multi-level child objects

I have a hierarchy of objects, Order, Contact, Address:

public class Order {
     public virtual Contact BillingContact { get; set; }
}

public class Contact {
     public virtual Address Address { get; set; }
}

I want to query an order by id, and eager load the billingcontact, along with it's address.

var criteria = DetachedCriteria.For<Order>()
     .SetFetchMode("BillingContact", FetchMode.Eager)

This criteria eager loads the BillingContact, but understandably not the address of the BillingContact. If i add:

     .SetFetchMode("BillingContact.Address", FetchMode.Eager)

This does nothing to help.

Also note that these relationships are unidirectional:

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);
} 

How can I construct a criteria object that will load the child of the child? Do these relationship mappings seem correct?

like image 528
Sam Mueller Avatar asked Feb 18 '09 23:02

Sam Mueller


1 Answers

I believe you might need to add an alias to BillingContact to allow you access to it's Address.

Something like:

var criteria = DetachedCriteria.For<Order>()
  .CreateAlias("BillingContact", "bc")
  .SetFetchMode("BillingContact", FetchMode.Eager)
  .SetFetchMode("bc.Address", FetchMode.Eager)
like image 132
James Gregory Avatar answered Oct 04 '22 11:10

James Gregory