2009-02-18 15 views
24

ich eine Hierarchie von Objekten haben, Ordnung, Kontakt, Adresse:NHibernate Eager Laden Multi-Level-Kind-Objekte

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

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

Ich möchte eine Bestellung von ID abfragen, und eifrig Last die billingcontact, zusammen mit ihrer Adresse .

Dieses Kriterium eifrig lädt den BillingContact, aber verständlicherweise nicht die Adresse des BillingContact. Wenn ich füge hinzu:

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

Dies hilft nichts.

Beachten Sie auch, dass diese Beziehungen unidirektional sind:

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

Wie kann ich ein Kriterien-Objekt konstruieren, die das Kind des Kindes laden wird? Sind diese Beziehungszuordnungen korrekt?

+1

war die Antwort unten korrekt geliefert? Wenn ja, wählen Sie es bitte als solches aus. – DaveDev

+0

Ja, was war die Lösung hier? – Jacko

Antwort

26

Ich glaube, dass Sie BillingContact möglicherweise einen Alias ​​hinzufügen müssen, damit Sie auf seine Adresse zugreifen können.

Etwas wie:

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