2012-06-22 21 views
11

Me pregunto si es posible acelerar primero la primera consulta realizada con código EF.Tiempo de inicio de Entity Framework

He hecho un pequeño programa de prueba con una entidad que contiene 2 campos, y la primera consulta toma 2.2 segundos, la segunda consulta (que es exactamente la misma) toma 0.006 segundos.

Ya estoy precompilando la vista, por lo que no será de ayuda aquí. Creo que el problema es que lleva un tiempo construir el modelo en la memoria, pero ¿debería demorar tanto? ¿Y hay una manera de precompilar este modelo como lo hace con las vistas?

+1

No creo que sea posible, pero podría estar equivocado. Mire esta pregunta para comprender lo que está sucediendo durante la primera consulta http://stackoverflow.com/questions/5634338/ef-4-1-code-first-onmodelcreating-call-time –

+0

@ RaphaëlAlthaus Puede que tenga razón:/Es simplemente raro Puede construir su propio modelo utilizando la clase DbModelBuilder y luego llamando al método Build en ese objeto, por lo que debería ser posible hacerlo en tiempo de compilación en lugar de en tiempo de ejecución. Pero tal vez simplemente no se haya implementado. – nyhjem

+0

Puede llevar algún tiempo comprobar la compatibilidad del esquema de la base de datos. Puede verificar esto usando el generador de perfiles SQL. –

Respuesta

5

Este artículo: Squash Entity Framework startup time with pre-compiled views describe una solución en detalle.

Se trata de utilizar la opción Optimizar Entity Data Model en Herramientas Eléctricas Entity Framework para generar un archivo de clase pre-compilados .Views.

+4

Ya lo he intentado, pero ahora seguí los pasos del artículo al que me vinculó. La vista se está generando, pero ese primer acceso todavía es muy lento. He hecho una pequeña prueba. Primero accedo a la base de datos con un SqlConnection y SqlCommand correctos. Tarda 0.2 seg. Justo después de eso utilizo EF y hago algo similar (con.Users.Count();). ¡Esto toma 3.08 segundos ...! Luego ejecuto exactamente la misma línea de código, y de ahora en adelante solo toma 0.007 segundos ... Entonces, claramente EF está haciendo algo más que generar vistas cuando accede a la base de datos por primera vez. – nyhjem

4

Cuando realiza su primera consulta, EF se inicializa a sí mismo y eso lleva tiempo. No creo que haya mucho que hacer para acelerar la inicialización de la infraestructura de EF, pero si lo que realmente está buscando es acelerar la primera consulta que realiza y no la inicialización de EF en sí misma, bueno, puede intentar forzar la inicialización de EF antes de ejecutar su primera consulta.

 using (var db = new MyContext()) 
     { 
      db.Database.Initialize(force: true); 
     } 
+3

force = true will, bien, forzar la reinicialización incluso si ya se inicializó su infraestructura/internos anteriormente, por lo que no use force: true a menos que haya cambiado la cadena de conexión o las estructuras de la tabla. –