2011-05-20 18 views
7

Tengo un gráfico de objetos bastante complejo que quiero cargar de una sola vez swoop.NHibernate Eager Cargando con la API Queryover en un gráfico de objetos complejos

muestras tienen Daylogs que tienen Análisis Daylog que tienen Daylog Resultados

Análisis Daylog tener Testkeys, Daylog resultados han Resultkeys, y TestKeys tener Resultkeys.

estoy usando la API QueryOver y futuro para ejecutar estos todo como una consulta, y todos los datos que NHibernate debería necesitar para crear una instancia está siendo devuelto todo el gráfico , verfied por NHProf.

   public static IList<Daylog> DatablockLoad(Isession sess, 
ICollection<int> ids) 
       { 
         var daylogQuery = sess.QueryOver<Daylog>() 
           .WhereRestrictionOn(dl => dl.DaylogID).IsIn(ids.ToArray()) 
           .Fetch(dl => dl.Tests).Eager 
           .TransformUsing(Transformers.DistinctRootEntity) 
           .Future<Daylog>(); 

         sess.QueryOver<DaylogTest>() 
           .WhereRestrictionOn(dlt => 
dlt.Daylog.DaylogID).IsIn(ids.ToArray()) 
           .Fetch(dlt => dlt.Results).Eager 
           .Inner.JoinQueryOver<TestKey>(dlt => dlt.TestKey) 
           .Fetch(dlt => dlt.TestKey).Eager 
           .Inner.JoinQueryOver<ResultKey>(tk => tk.Results) 
           .Fetch(dlt => dlt.TestKey.Results).Eager 
           .Future<DaylogTest>(); 

         sess.QueryOver<DaylogResult>() 
           .Inner.JoinQueryOver(dlr => dlr.DaylogTest) 
           .WhereRestrictionOn(dlt => 
dlt.Daylog.DaylogID).IsIn(ids.ToArray()) 
           .Fetch(dlr => dlr.ResultKey).Eager 
           .Fetch(dlr => dlr.History).Eager 
           .Future<DaylogResult>(); 

         var daylogs = daylogQuery.ToList(); 

         return daylogs; 
       } 

Sin embargo, aún así terminar con los proxies para representar la relación entre TestKey y ResultKey, a pesar de que estoy específicamente cargar esa relación.

creo que esta consulta es probablemente toda representante de una mala comprensión de la API QueryOver, así que me gustaría cualquiera y todos los consejos en él, pero sobre todo, me gustaría entender por qué me sale un proxy y no una lista de resultados cuando más tarde intento obtener daylogresult.resultkey.testkey.results.

¿Algún ayuda?

Respuesta

5

La respuesta fue llamar a NHibernateUtil.Initialize en varios objetos. Simplemente tirando de los datos hacia abajo no significa que NHibernate hidratará todos los proxies.

0

Debe cargar todas sus entidades en una sola cláusula QueryOver para deshacerse de los proxies. Pero en este caso tendrá muchas combinaciones en su consulta, por lo que le recomiendo que utilice la carga diferida con lotes.

Cuestiones relacionadas