2009-02-24 22 views
5

Tengo un gráfico de objetos bastante profundo (5-6 nodos), y mientras recorro partes de él NHProf me dice que tengo un problema de "Seleccione N + 1" (que hacer).Prevenir fluidez NHibernate seleccionar n + 1

Las dos soluciones yo sepa son

  1. Eager hijos de carga
  2. resquebrajarse mi gráfico de objetos (y la carga ansiosa)

Realmente no quiero hacer, ya sea de estos (aunque puedo dividir el gráfico más tarde, ya que lo veo crecer)

Por ahora ....

¿Es posible decirle a NHibernate (con FluentNHibernate) que cada vez que intento acceder a los niños, los cargo de una vez, en lugar de seleccionar -n + 1-ing mientras los recorro?

También recibo "conjuntos de resultados ilimitados", que es probablemente el mismo problema (o más bien, se solucionará con la solución anterior si es posible).

Cada colección de elementos secundarios (en todo el gráfico) solo tendrá alrededor de 20 miembros, pero 20^5 es mucho, por lo que no quiero cargar todo con entusiasmo cuando obtengo la raíz, simplemente obtengo todos colección de niños cada vez que me acerco a ella.

Edición: una idea de último momento .... ¿Qué pasa si quiero introducir la paginación cuando quiero renderizar niños? ¿TENGO que romper mi gráfico de objeto aquí, o hay algún adelanto que pueda emplear para resolver todos estos problemas?

Respuesta

9

Me parece que desea seguir el enfoque de usar su modelo de dominio en lugar de crear una consulta nhibernate específica para manejar este escenario. Dado esto, sugiero que eche un vistazo al atributo de tamaño de lote que puede aplicar a sus colecciones. La interfaz fluida Fluido NHibernate todavía no soporta este atributo, sino como una solución alternativa que puede utilizar:

HasMany(x => x.Children).AsSet().SetAttribute("batch-size", "20") 

Dada la falta general de información sobre su situación exacta, no puedo decir con seguridad si por lotes de tamaño es la solución ideal, pero ciertamente recomiendo que lo pruebes. Si no lo ha hecho, le sugiero que lea los siguientes:

http://www.nhforge.org/wikis/howtonh/lazy-loading-eager-loading.aspx

http://nhibernate.info/doc/nhibernate-reference/performance.html

documentación sobre el rendimiento El NHibernate explicará cómo funciona el proceso por lotes de tamaño.

Editar: No tengo conocimiento de ninguna forma de página de su modelo de dominio. Te recomiendo que escribas NH consultas para escenarios donde se requiere paginación.

+0

"Me parece que desea seguir el enfoque de usar su modelo de dominio en lugar de crear una consulta nhibernate específica para manejar este escenario". Definitivamente. lo último que quiero es consultas específicas. Comprobaré esas cosas, ta –

+3

nota -> la interfaz fluent-nh ahora admite el atributo BatchSize() – KevinT

0

Editar: el último momento .... ¿Qué pasa si quiero introducir paginación cuando quiero para hacer los niños? ¿TIENES que romper mi gráfico de objeto aquí, o hay alguna astucia que pueda emplear para resolver todos los problemas de ?

Bueno, si solo carga los niños, puede colocarlos en la página :). Pero si quieres algo como: LoadParent Y PageChildren, entonces no creo que puedas hacer eso.

Cuestiones relacionadas