[Entity Framework] Lazy Load y SQL Profile

Hola, una de las características mas importantes de Entity Framework es la aplicación del patrón Lazi Load, que a grandes rasgos, se basa en ir cargando los distintos componentes de una clase cuando los vamos usando.

Teniendo presente esto, vale recordar otra de las características [buena y no tan buena] de Entity Framework, las propiedades de navegación, estas son las representaciones conceptuales que se tiene de una llave foránea y varían según la relación [uno a uno – uno a varios ], teniendo así por defecto un objeto o una colección de objetos de cada una de las entidades con las que se una entidad se relaciona.

El Lazy Load viene por defecto activado cuando creamos nuestro modelo de Entity Framework:

Para ver el funcionamiento de este, veamos un ejemplo:

En nuestra base de datos Pais  – Ciudad tenemos una relación de Uno a varios por lo que el objeto que deberá contener la entidad Pais en sus propiedades de navegación es una colección de Ciudad, y Ciudad deberá tener un objeto de Pasi en sus propiedades de navegación. Si ejecutamos una consulta en la que se recupera todo una colección de paises y en debug exploramos lo que en esta hay, veremos que se ha cargado una colección de Ciudad en nuestros objetos Pais.

En el post anterior de esta serie vimos como obtener el código SQL que se generaba a partir de una consulta Linq, otra forma de hacerlo es con las herramientas de performance de los motores de base de datos, en este ejemplo lo haré con SQL Server 2008.

Para abrir el Sql Server Profiler se debe ir a inicio – todos los programas – Microsoft Sql Server 2008 R2 – Performance tools, así:

Creamos un nuevo Trace, le asignamos un nombre y empezamos a trabajar:

Si ejecutamos la consulta anterior, veremos que en el Profiler no se marca mas que una consulta, ¿por que? bien esa es la “magia” de el Lazy Load, como no hemos requerido de este objeto [colección de Ciudades] pues no se ha mandado a ejecutar ninguna otra consulta, basta con desplegar el explorador de objetos en modo debug para que se requiera ejecutar otra consulta y cargar así, otra colección u objeto:

Como vemos al desplegar las propiedades de un objeto Pais que contiene una colección de tipo Ciudad se manda a ejecutar una sentencia adicional, esta sentencia dependerá de el proveedor especifico que se este manejando, en este caso SQL Server.

Teniendo en cuenta lo anterior ya sabemos que es lo que pasa con sentencias de este tipo [imagen], se debe ir dos veces a la base de datos, asi se trabaje con una colección y no directamente con el contexto.

– Lazy Load Disabled

Por lo general acostumbro a trabajar con el Lazy Load deshabitado, pese a que los objetos se crean por demanda, me gusta tener el control sobre estos a mi y a nada mas :P, veamos como se comporta:

La sentencia anterior se vera reflejada en el SQL Profiler así:

Como vemos NO SE HA GENERADO una segunda sentencia SQL para traer la colección de Ciudad relacionadas con un Pais y por tanto al intentar obtener un objeto de este tipo vendrá NULL. Pero y si de verad necesitamos traernos con nosotros estas colecciones u objetos, ¿que hacemos? Simple, se acude a el método Include(), así:

Y lo que veremos en el SQL Profiler, es el resultado de el proveedor especifico, una consulta anidada :S he investigado y no cambia mucho en rendimiento contra un join por ejemplo, pero si me parece complejo (a simple vista :D).

Casi nunca necesito retornar un objeto y a la vez sus hijos, pero es una característica, no se hasta que punto elegante, pero en ocasiones muy útil.

Espero les sea de utilidad.

Hasta el próximo post.

Anuncios
[Entity Framework] Lazy Load y SQL Profile

2 comentarios en “[Entity Framework] Lazy Load y SQL Profile

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s