2010-12-02 21 views
6

Con LINQ to Sql, puede especificar, para una recuperación dada, que no desea que se carguen elementos secundarios específicos (con impaciencia o pereza). ¿Es esto posible en NHibernate? Hay momentos en los que solo quiero el objeto raíz y/o solo parte del gráfico de objetos, y me gustaría poder especificar eso en lugar de tener que escribir un DTO y hacer un mapeo solo para evitar el hecho de que NHibernate se siente obligado a cargar todo si intento serializar mi objeto.¿Puedo desactivar selectivamente la carga lenta con NHibernate?

Gracias!

Respuesta

5

Sí, pero ...

El nivel de flexibilidad que tiene aquí puede depender de la versión de NHibernate y cómo se está construyendo su consulta. Por ejemplo, una consulta LINQ (aquí es donde el control de versiones puede marcar la diferencia) no le dará la misma flexibilidad que una consulta ICriteria o HQL.

Con la API de criterios, puede llamar al .SetFetchMode(), pasando la propiedad y el modo deseado para esa consulta.

NHibernate también le permite crear proyecciones, por lo que puede instanciar objetos de tipos no asignados o DTO sin mapeo. Por supuesto, una proyección va solo en un sentido; si no está mapeado, no puede persistir.

+0

Eso es lo que estoy buscando, gracias. Me gustaría hacer esto por solicitud en lugar de codificarlo en la colección. – sydneyos

2

Todo lo que Jay ya se ha dicho, además de que puede especificar la pereza en sus archivos de mapeo ... Se puede especificar que a nivel de clase:

<class name="Foo" lazy="true"> 
    <!-- additional data --> 

O en el nivel de propiedad/recogida:

<property Name="Bar" lazy="true"/> 
<set Name="Bars" lazy="true"> <-- makes the collection lazy 
<set Name="Bars" fetch="join"> <-- eagerly fetches child items in the collection 
<set Name="Bars" fetch="select"> <-- fetches items via another select when the collection is accessed for the first time 

Estos valores predeterminados se pueden anular para consultas específicas y HQL los ignora.

Cuestiones relacionadas