Mejores prácticas para mejorar el rendimiento de Entity Framework

Entity Framework de Microsoft es un ORM extendido que le ayuda a aislar el modelo de objetos de su aplicación del modelo de datos. Es un marco ORM de código abierto para ADO.Net y se incluye como parte de .Net Framework. En esta publicación, presentaré algunos consejos que se pueden seguir para optimizar el rendimiento de Entity Framework. En las secciones que siguen, examinaré algunos consejos que se pueden adoptar para mejorar el rendimiento de la aplicación cuando se trabaja con Entity Framework.

¿Su modelo de datos de entidad representa una sola unidad de trabajo?

Cuando crea su EDM (modelo de datos de entidad), debe asegurarse de que el EDM representa una sola unidad de trabajo y no la base de datos completa, especialmente cuando tiene muchos objetos (tablas, procedimientos almacenados, vistas, etc.) en su base de datos que están desconectados. o no son necesarios para una unidad de trabajo en particular. Si su EDM representa la base de datos completa cuando no es necesaria, puede degradar el rendimiento de la aplicación debido a la necesidad de cargar muchos objetos innecesarios en la memoria. En esencia, debe dividir un modelo de datos de entidad grande en otros más pequeños y cada modelo representa una unidad de trabajo.

Puede consultar este artículo de MSDN para obtener más información sobre cómo se puede mejorar el rendimiento de Entity Framework.

Deshabilitar el seguimiento de cambios

Debe deshabilitar el seguimiento de cambios si no es necesario. Lo más importante es que no necesita el seguimiento de cambios cuando solo desea recuperar datos y las actualizaciones sobre la lectura de datos no son necesarias en absoluto. Puede utilizar la siguiente declaración para deshabilitar el seguimiento de cambios o almacenar en caché el resultado de una consulta cuando desee recuperar clientes de la base de datos sin la necesidad de actualizar los registros.

Si desea deshabilitar el seguimiento de objetos para la tabla Clientes, puede usar el siguiente código.

PayrollContext context = new PayrollContext();

Reduzca el costo de generación de vistas usando vistas pregeneradas

La creación de ObjectContext es una operación costosa ya que implica el costo de cargar y validar los metadatos. Debe aprovechar las vistas generadas previamente para reducir el tiempo de respuesta cuando se ejecuta la primera solicitud. En esencia, el tiempo de ejecución de Entity Framework crea un conjunto de clases (también llamado vista) cuando se crea una instancia del contexto del objeto por primera vez. Puede reducir esta sobrecarga generando previamente la vista para el archivo EDMX utilizando la herramienta de línea de comandos EdmGen.exe o las plantillas T4. Tenga en cuenta que si los archivos de esquema del modelo han cambiado, deberá volver a generar el archivo de vistas ejecutando EdmGen.exe con el indicador / mode: ViewGeneration. También puede generar previamente vistas con un modelo de código primero.

Deshabilitar la detección automática de cambios

Al intentar actualizar la base de datos, Entity Framework necesita conocer los cambios que se han realizado en una entidad desde el momento en que se cargó en la memoria. Esta detección de cambios se realiza comparando los valores antiguos de las propiedades con los valores nuevos o modificados cuando realiza una llamada a los métodos como Find (), Remove (), Add (), Attach () y SaveChanges (). Esta detección de cambios es muy costosa y puede degradar el rendimiento de la aplicación principalmente cuando se trabaja con muchas entidades. Puede deshabilitar la detección de cambios usando el siguiente código.

Cuando desee deshabilitar la detección de cambios, es una buena práctica deshabilitarlo dentro de un bloque try / catch y luego volver a habilitarlo dentro del finalmente bloque. Tenga en cuenta que puede ignorar esto cuando esté trabajando con un conjunto de datos relativamente pequeño; obtendría ganancias de rendimiento significativas al desactivar la detección de cambios cuando esté trabajando con un conjunto de datos grande.

Otros puntos a tener en cuenta

Utilice proyecciones para seleccionar solo los campos que se necesitan al recuperar datos. Debe evitar recuperar campos que no son necesarios.

El siguiente fragmento de código ilustra cómo puede utilizar la recuperación de datos de una manera paginada; observe cómo se han utilizado el índice de la página inicial y el tamaño de la página para seleccionar solo los datos necesarios.

int pageSize = 25, startingPageIndex = 1;

NorthwindEntities dataContext = new NorthwindEntities();

List lstCus = dataContext.tblCustomers.Take(pageSize)

.Skip(startingPageIndex * pageSize)

.ToList();

También debe seleccionar la colección adecuada y utilizar consultas compiladas para mejorar el rendimiento de sus consultas LINQ al recuperar datos expuestos por EDM. Evite extraer todos los objetos de la base de datos en un modelo de datos de entidad. Recupere solo la cantidad de registros necesarios y evite usar "Contiene" cuando use LINQ to Entities. Puede utilizar la paginación para recuperar solo los datos solicitados o restringir la cantidad de datos que se recuperan de la base de datos. Además, debe agregar índices a sus entidades haciendo una llamada al método CreateIndex ().

Puede obtener más información sobre las consideraciones de rendimiento al usar Entity Framework desde este enlace.