2011-05-12 18 views
31

Estoy en proceso de actualizar una aplicación de EF1 a EF4.1 Creé un DbContext y un conjunto de POCO utilizando las plantillas "ADO.NET DbContext Generator".DbContext ChangeTracking mata el rendimiento?

Cuando consulto el DbContext generado la parte de la base de datos de la consulta tarda 4ms en ejecutarse (validada con EF Profiler). Y luego toma el contexto unos 40 segundos (en palabras: ¡CUARENTA!) Para hacer lo que sea que haga antes de devolver el resultado a la aplicación.

EF1 maneja la misma consulta en menos de 2 segundos.

Desactivando AutoDetectChanges, LazyLoading y ProxyGeneration me gana 2-3 segundos.

Cuando uso el método de extensión AsNoTracking() puedo reducir el tiempo total de ejecución a aproximadamente 3 segundos.

Eso indica que ChangeTracking es el culpable.

Pero ChangeTracking es lo que necesito. Debo poder eventualmente persistir todos los cambios sin tener que seleccionar manualmente qué entidades fueron modificadas.

Alguna idea de cómo podría resolver ese problema de rendimiento?

+1

Se discutió aquí varias veces. Parece un error en EFv4.1 –

+0

Es aún peor cuando uso EF4.0 y la plantilla "ADO.NET POCO Entity Generator". Luego toma más de 80 segundos hasta que tenga algún resultado. ¿Entonces el error fue aún más severo con una versión anterior y MS no pudo arreglarlo correctamente en EF4.1? –

+3

Puede intentar desactivar 'AutoDetectChanges'/usar' AsNoTracking' pero al mismo tiempo crear proxys de rastreo (todas las propiedades deben ser virtuales). Me pregunto si esta pista cambia o no y no puedo probarla yo mismo ahora. –

Respuesta

1

¿Es útil la técnica al final de este documentation? Alternativamente, he evitado muchas de las trampas en el rendimiento usando una interfaz fluida para declarar declarativamente qué entidades en una transacción dada seguramente no cambiarán frente a las que podrían cambiar (inmutables vs. inmutables). Por ejemplo, si las entidades que guardo son raíces agregadas en las que la raíz o sus entidades hacen referencia a elementos "refdata", esta heurística evita muchas escrituras porque no es necesario rastrear los elementos inmutables . Los elementos mutables se escriben sin control (una debilidad ... Uno que puede o no ser aceptable).

Estoy usando esto con un patrón de repositorio genérico precisamente porque no quiero rastrear cambios o implementar una estrategia específica para cada caso. Si eso no es suficiente, quizás establezca su propio seguimiento de cambios fuera del contexto y agregue entidades según sea necesario.

+1

El enlace está roto –

Cuestiones relacionadas