EF 4.0 Performance Tips #4

Como muchos sabréis, sobre todo lo que ya habéis jugado con la primera version de ADO.NET Entity Framework, una de las novedades en la version actual es la carga perezosa de forma implícita o automática. Esta nueva opción de carga viene marcada de forma automática con la plantilla de generacion de código por defecto, clases prescriptivas, por medio de una opción llamada LazyLoadingEnabled tal como podéis observar en el siguiente trozo de código que muestra el constructor por defecto de un contexto de trabajo generado con ADO.NET EF.

Aunque esta opción es realmente cómoda, ya que nos libra dentro del ambiente de un contexto de tener que hacer un Load explícito de una propiedad de navegación, si no tenemos cuidado puede resultar un punto negro dentro del rendimiento por un incremento innecesario de consultas a la base de datos. Pongamos un ejemplo típico de una relación uno a muchos como la que se muestra en la siguiente figura.

 

Untitled

Ahora, partiendo de este modelo imáginese que se realiza la siguiente operación:

 

Si miramos el número de consultas por medio de cualquier profiler o Intellitrace podremos ver como el número de consultas es N+1 siendo N el número de elementos de tipo Detail contenidos dentro de la base de datos.

 

Untitled2

Lógicamente, si conocemos que dentro de nuestro negocio necesitamos acceder a esos datos una solución para resolver este problema es realizar una expansión de consultas, indicando a la consulta de detalles que vamos a necesitar acceder también a su navegación con los maestros. Para realizar esta expansión de consultas en ADO.NET EF disponemos desde la primera versión del producto del método Include. El siguiente trozo de código muestra como realizar el mismo proceso que anteriormente con expansión de consultas.

NOTA: Para todos los que estéis chillando por poner el nombre de la propiedad de navegación, Master, entre comillas, saber que es posible crear un método extensor para superar este problema, pondré un post con esto dentro de poco.

 

Si revisamos ahora nuestro Intellitrace veremos como el número de las consultas se ha quedado solamente en 1, que consiste en un simple INNER JOIN entre Detail y Master

 

Untitled3

 

Saludos

Unai Zorrilla

6 comentarios sobre “EF 4.0 Performance Tips #4”

  1. en la linea Context.ContextOptions.LazyLoadingEnabled = true;

    no debe establecerce la propiedad LazyLoadingEnabled en false para que no traiga las demas tablas?

  2. A ver, lo que comento en este TIP no es como desactivar Lazy Loading implícito o la decisión de usarlo, sino el tener en cuenta cuando tiene sentido utilizarlo y cuando hacer una expansion de consultas en vez de delegar en lazy loading.

    Unai

  3. Hola Unai. Una pregunta al respecto pero en sentido contrario. ¿Es posible disponer de LazyLoading implícito usando STEs? Parece que por defecto no está disponible esa opción, y para obtenerlo habría que modificar las plantillas t4. Si es así, tienes alguna pista sobre ello?

    Muchas gracias.

Responder a anonymous Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *