2011-03-25 16 views
7

Dada una gráfica multi objeto nivel ser llamado usando futuro como:NHibernate Future gráfico de objetos muchas consultas

var Dads = db.Session.Query<Parent>().Where(P => P.EntityKey == Id) 
      .ToFuture<Parent>(); 
var Kids = db.Session.Query<Kid>().Where(K => K.Parent.EntityKey == Id) 
      .ToFuture<Kid>(); 

cuando llamo var papá = dads.ToList() Veo el lote ir a través del alambre y mostrar en perfilador.

El problema es que al enumerar la colección que sigue enviando uno de las consultas a la base de datos

Ej.

for each (Kid kid in Dad.Kids) // This seems to hit the database 
{ 
    Teach(kid); 
} 

Envía una consulta SQL y entra en la base de datos para obtener cada niño. ¿Por qué el gráfico de objeto no está poblado? o es este comportamiento esperado?

+0

Este es un código perturbador. – Ciel

Respuesta

4

Ese comportamiento es de esperar. Simplemente le está diciendo a NHibernate que obtenga dos colecciones de la base de datos en un lote, que está haciendo como se le dijo. Sin embargo, no estás diciendo que están relacionados. NH Queries with Futures no agrupa a las entidades después de ejecutarlas a menos que se les indique que lo hagan con una unión.

Si ejecutó las consultas por separado sin Futures, no esperaría que la entidad principal repentinamente tuviera la colección secundaria completa. Básicamente, los futuros le permiten ejecutar las cosas en una ida y vuelta. Si las consultas tienen una raíz común con varias colecciones secundarias (por ejemplo, para evitar un producto cartesiano), NH puede "combinar" varias colecciones en una sola entidad.

Desafortunadamente, la unión con NH LINQ Api y el método ToFuture() parece plantear un problema en la implementación actual (NH 3.0 o 3.1). Es posible que necesite usar QueryOver Api en ese caso.

En una nota lateral, creo que el nombre del método no es apropiado.

Editar: Después de la edición de la pregunta, el nombre del método está ahora bien.

+1

Eres sabio. Gracias. Recientemente he visto a varias personas buscando una respuesta a esta situación. – Firegarden

+1

Un ejemplo de la solución se puede encontrar aquí: http://stackoverflow.com/questions/5266180/fighting-cartesian-product-x-join-when-using-nhibernate-3-0-0 – Firegarden

+0

las consultas pasan a tener una raíz común: explique cómo configuró esta raíz común. – joncodo

Cuestiones relacionadas