Precompilación de Vistas en el Entity Framework

En la búsqueda de
un mejor rendimiento dentro de mis aplicaciones que utilizan Entity Framework
(EF), logre encontrar información relacionada con la precompilación de vistas,
el cual es un procedimiento que permite disminuir de manera significativa el costo
de ejecución en consultas hechas contra el modelo.

La documentación
oficial de Microsoft menciona el hecho de que antes de que el EF ejecute una
consulta contra un modelo conceptual o salve cambios a la fuente de datos, este
debe generar un conjunto de vistas locales que acceden a la base de datos,  este proceso resulta demasiado costoso, como
referencia sobre este tema hay un blog titulado “Exploring the Performance of
the ADO.NET Entity Framework – Part 1” (http://blogs.msdn.com/b/adonet/archive/2008/02/04/exploring-the-performance-of-the-ado-net-entity-framework-part-1.aspx). 

Una solución propuesta para contrarestar esta
conducta del Entity es la precompilación de vistas y su inclusión en el
proyecto a fin de garantizar no tener que crearlas en tiempo de ejecución. 

Para este blog
usare  SQL Server 2008  y Visual Studio 2010, basando nuestro modelo
en la BD Adventure Works.  Iniciamos
creando una nueva solución, y especificamos un proyecto de tipo <<Class
Library>>, esto nos brinda la ventaja de poder usarlo en muchos
proyectos, el siguiente paso consiste en crear un archivo de tipo <<ADO .Net
Entity Data Model>> y definimos el modelo con el nombre AWModel.edmx como
muestra la siguiente pantalla:

 

Definimos que el
modelo se generara desde la BD y seleccionamos algunas tablas representativas
para su integración dentro del modelo de entidades. 

 

Una vez finalizado
este procedimiento se nos presenta el modelo con las entidades seleccionadas,
hasta el momento los pasos realizados son simplemente de configuración de
nuestro proyecto y son la antesala al proceso especifico de creación de las vistas
precompiladas.  El primer paso para este
proceso consiste en cambiar la propiedad Metadata
Artifact Processing
de nuestro modelo, el cual debe contener la opción
<<Copy to Output Directory>>

 

Una vez realizado
este cambio, procedemos a realizar un Build de la solución y verificamos en el
directorio de salida que se encuentren tres nuevos archivos que conforman los
archivos de mapeo del modelo.  La
siguiente imagen muestra la relación de estos archivos con el modelo:

 

 

Para mayor detalle
sobre el tema sugiero la lectura del segundo capítulo (Pag.29) del libro
Programming Entity Framework  Second
Edition de Julie Lerman.  Los archivos
generados para nuestro ejemplo son los siguientes:

Estos archivos los
incluiremos dentro de nuestra solución, damos click derecho en el proyecto y
escogemos la opción Add – Existing Items, y seleccionamos los tres archivos,
luego seleccionamos a cada uno de estos archivos y en la ventana de propiedades
establecemos Build Action al valor Embedded Resource este paso nos permite
definir dichos archivos como recursos embebidos en el Assembly que contiene
nuestro modelo.

Continuamos con la
creación de la denominada vista de entidades, para lo cual nos vamos a la
opción de propiedades del proyecto, y nos situamos en el tab Build
Events
y en la opción Prebuild Event Commands Line , en
este casilla debemos de especificar el siguiente código:

“%windir%Microsoft.NETFrameworkv4.0.30319EdmGen.exe”
/nologo /language:CSharp /mode:ViewGeneration “/inssdl:$(TargetDir)AWModel.ssdl”
“/incsdl:$(TargetDir)AWModel.csdl” “/inmsl:$(TargetDir)AWModel.msl”
“/outviews:$(ProjectDir)AWModel.Views.cs”

Cabe destacar que
para el caso de utilizar Visual Basic, solo se reemplaza CSharp por VB.  El siguiente paso consiste en hacer un
Rebuild de la solución.

 

A continuación incluimos el nuevo archivo generado AWModelView.cs, damos click
derecho en el proyecto y en la opción Add – Existing Item seleccionamos el
archivo de vista.

 

 

 

Con el apoyo de la
herramienta Red Gate’s .Net Reflector nos permite analizar el assembly
compilado, es interesante observar como en la sección de Resources nos
despliega los archivos que forman el esquema de nuestro modelo, además de
incluir la vista generada.

 

Llegando a este
punto contamos con un Assembly cuyo contenido esencialmente es nuestro modelo
de entidades, así como los archivos que conforman su metadata.  Esto nos permitirá incorporar nuestro
Assembly en diferentes proyectos, además de mantener una mayor eficiencia en
los tiempos de ejecución de nuestra aplicación, debido a la pre compilación de
las vistas. 

En posteriores blog
estare abordando otros puntos y tips que pueden resultar de utilidad en el
desarrollo de aplicaciones con Entity Framework.

 

 

 

4 comentarios en “Precompilación de Vistas en el Entity Framework”

  1. Muchas felicidades, muy buen articulo, realmente aminora significativamente el tiempo de ejecucion del nuestra Solucion. Gracias por el Secreto…

  2. Hola Mario.
    Magnífico tu post, pero una pregunta
    ¿Por qué agregas los ficheros .csdl, .msl y .ssdl después al proyecto como recursos incrustados?
    Es decir, he seguido tu ejemplo paso a paso y todo funciona correctamente sin agregar estos ficheros.
    De hecho, si los agrego lo que pasa es que cuando hago cambios en el .emdx, los ficheros se quedan desactualizados respecto al modelo (no así la vistas compiladas que refrescan automáticamente los cambios al generar el proyecto).
    Gracias y un saludo.

  3. Hola panicoenlaxbox, disculpa la tardanza en la respuesta, pero tenia un rato de no revisar las opiniones de mis artículos.

    Recuerda que el enfoque del artículo brinda como elemento el hecho que el proyecto sera < >, de manera que pueda ser consumido por otras aplicaciones, por lo que cualquier cambio deberá incluir el rebuild del proyecto y por ende tener embebidos los archivos antes mencionados(csdl,msl,ssdl).

    Saludos cordiales. Geovanny -Gio- Hernández.

Deja un comentario

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