2009-02-18 10 views
24

J'ai une hiérarchie d'objets, Ordre, Contact, Adresse:NHibernate Désireuse chargement des objets enfant à plusieurs niveaux

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

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

Je veux interroger un ordre par identifiant et charge désireux du billingcontact, ainsi que son adresse .

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

Ce critère charge désireux du BillingContact, mais évidemment pas l'adresse du BillingContact. Si j'ajoute:

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

Cela n'aide en rien.

Notez également que ces relations sont unidirectionnelles:

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

Comment puis-je construire un objet critères qui charge l'enfant de l'enfant? Ces mappages de relations semblent-ils corrects?

+1

a été la réponse fournie ci-dessous correcte? Si oui, veuillez le sélectionner comme tel. – DaveDev

+0

Ouais, quelle était la solution ici? – Jacko

Répondre

26

Je crois que vous pourriez avoir besoin d'ajouter un alias à BillingContact pour vous permettre d'accéder à son adresse.

Quelque chose comme:

var criteria = DetachedCriteria.For<Order>() 
    .CreateAlias("BillingContact", "bc") 
    .SetFetchMode("BillingContact", FetchMode.Eager) 
    .SetFetchMode("bc.Address", FetchMode.Eager) 
Questions connexes