2011-06-15 8 views
10

tengo los siguientes override mapeo en un lado de la relación:Fetch.Join() no funciona en Fluido NHibernate

public void Override(AutoMapping<ItemAsmtDetailDh> mapping) 
{ 
    mapping.HasMany<WAsmtDetail>(x => x.WAsmtDetails).Inverse().AsBag().Cascade.AllDeleteOrphan().Access.PascalCaseField(Prefix.Underscore).Not.LazyLoad().Fetch.Join(); 
} 

y en el otro lado de la relación que tengo:

public void Override(AutoMapping<WAsmtDetail> mapping) 
{ 
    mapping.References<ItemAsmtDetailDh>(x => x.ItemAsmtDetailDh).Not.Nullable().Not.LazyLoad().Fetch.Join(); 
} 

Cuando uso la opción ShowSql veo que sigue emitiendo sentencias de selección separadas para WAsmtDetails que me da el temido problema "n + 1 selecciona". ¿Por qué se ignora ".Not.LazyLoad(). Fetch.Join()"?

Nota: Estoy usando la versión 1.1 Fluido NHibernate, no versión 2.1, debido a un error en la versión más reciente. (Consulte mi respuesta para this question para obtener detalles sobre el error). Estoy usando NHibernate versión 2.1.2.4000.

Respuesta

7

Es muy probable que cargue los datos de una manera que no se ve afectada por Fetch.Join() en la asignación (como HQL o Linq). De la documentación NHibernate:

La estrategia de recuperación se define en el documento de mapeo afecta:

  • recuperación a través get() o Load()
  • recuperación que ocurre implícitamente cuando una asociación se navega
  • ICriteria consulta
  • consultas HQL si se utiliza ir a buscar subselección
+0

Gracias por la respuesta, cremor. En mi situación, uso CreateCriteria para recuperar una lista de objetos en el nivel de raíz agregado. La raíz agregada está 2 niveles por encima de la clase "ItemAsmtDetailDh" mencionada en mi pregunta. Luego borro el padre de ItemAsmtDetailDh (1 nivel arriba). NH está recuperando el resto del agregado desde ese punto hacia abajo para eliminarlo. Consideraría esto como un caso de recuperación por navegación de asociaciones. – MylesRip

Cuestiones relacionadas