2011-11-22 24 views
6

Biorąc pod uwagę związek Team -> sportowca i wysyłając zapytanie do wszystkich sportowców. Co nie rozumiem o fetch="Join"? Czy to odwzorowanie powinno spowodować załadowanie Drużyny przez połączenie? Podczas iterowania sportowców, wciąż leniwy ładuje zespół.NHibernate Join Fetch (Rodzaj)

public class AthleteMap : ClassMapping<Athlete> 
{ 
     public AthleteMap() 
     { 
      ManyToOne(a => a.Team, o => 
             { 
              o.Fetch(FetchKind.Join); 
              o.Lazy(LazyRelation.NoLazy); 
             } 
       );  
     }  
} 

która produkuje ten HBM:

<class name="Athlete" table="Athletes"> 
    <id name="Id" type="Int32" /> 
    <property name="FirstName" /> 
    <property name="LastName" /> 
    <many-to-one name="Team" fetch="join" lazy="false" /> 
    <property name="Created" /> 
</class> 

Iteracja:

var session = factory.OpenSession(); 

foreach (var athlete in session.Query<Athlete>()) 
    Console.WriteLine("{0} {1}", athlete.FirstName, athlete.Team.Name); 
+0

Czy otrzymujesz wyjątek? Które? – Gerard

+0

Czyli podczas iteracji widzisz zapytania pobierające "drużynę" na "atletę"? Mam na myśli, że mapowanie jest poprawne, z wyjątkiem szybkiego pobierania? –

+0

Brak wyjątków. @GertArnold tak podczas iteracji, pyta Zespół o każdą iterację. – mxmissile

Odpowiedz

13

NHibernate LINQ kwerendy nie wykorzystuje strategię pobierał mapowania. Musisz pobrać() w swoim zapytaniu linq w ten sposób.

var session = factory.OpenSession(); 

foreach (var athlete in session.Query<Athlete>().Fetch(x => x.Team)) 
    Console.WriteLine("{0} {1}", athlete.FirstName, athlete.Team.Name); 

Strategia pobierać zdefiniowane w dokumencie odwzorowania wpływa:

  • pobieranie poprzez get() lub load()
  • odzyskiwanie, co dzieje się w sposób dorozumiany, gdy związek jest poruszać
  • ICriteria odpytuje
  • Zapytania HQL, jeśli wybrano pobieranie podselektu:

źródło: performance-fetching

+1

Dzięki ... szkoda, że ​​ich implementacja Linq jest niekompletna. – klkitchens