Marco de la entidad muy lento para cargar por primera vez después de cada comstackción

Como el título sugiere que tengo un problema con la primera consulta en una base de datos de SQL Server con Entity Framework. Intenté buscar una respuesta, pero nadie parece tener una solución para esto.

Las pruebas se realizaron en Visual Studio 2012 utilizando Entity Framework 6, también utilicé la plantilla de vistas T4 para precomstackr las vistas. La base de datos estaba en un servidor SQL 2008. Tenemos alrededor de 400 POCO (400 archivos de mapeo), solo tenemos 100 filas de datos en la tabla de la base de datos.

La siguiente captura es mi código de prueba y resultado.

static void Main(string[] args){ Stopwatch st=new Stopwatch(); st.Start(); new TestDbContext().Set.FirstOrDefault(); st.stop(); Console.WriteLine("First Time "+st.ElapsedMilliseconds+ " milliseconds"); st.Reset(); st.Start(); new TestDbContext().Set.FirstOrDefault(); st.stop(); Console.WriteLine("Second Time "+st.ElapsedMilliseconds+ " milliseconds"); } 

Resultados de la prueba

 First Time 15480 milliseconds Second Time 10 milliseconds 

En la primera consulta, EF comstack el modelo. Esto puede tomar un tiempo serio para un modelo tan grande.

Aquí hay 3 sugerencias: http://www.fusonic.net/en/blog/2014/07/09/three-steps-for-fast-entityframework-6.1-first-query-performance/

Un resumen:

  1. Usando una tienda de modelo db en caché
  2. Generar vistas pre comstackdas
  3. Genere una versión precomstackda de entityframework usando n-gen para evitar jits

También me aseguraría de comstackr la aplicación en modo de lanzamiento cuando realice los puntos de referencia.

Otra solución es analizar la división del DBContext. 400 entidades es mucho y debería ser mejor trabajar con porciones más pequeñas. No lo he intentado pero supongo que sería posible construir los modelos uno por uno, lo que significa que ninguna carga tarda 15 segundos. Ver esta publicación de Julie Lerman https://msdn.microsoft.com/en-us/magazine/jj883952.aspx

este trabajo para mí:

 using (MyEntities db = new MyEntities()) { db.Configuration.AutoDetectChangesEnabled = false; // <----- trick db.Configuration.LazyLoadingEnabled = false; // <----- trick DateTime Created = DateTime.Now; var obj = from tbl in db.MyTable where DateTime.Compare(tbl.Created, Created) == 0 select tbl; dataGrid1.ItemsSource = obj.ToList(); dataGrid.Items.Refresh(); } 

Puedes intentar algo como esto: (funcionó para mí)

 protected void Application_Start() { Start(() => { using (EF.DMEntities context = new EF.DMEntities()) { context.DMUsers.FirstOrDefault(); } }); } private void Start(Action a) { a.BeginInvoke(null, null); } 

Entity Framework – Primera consulta lenta

Creo que esa no es una muy buena solución. Ado.net parece mucho más rendimiento. Sin embargo, esta es mi opinión.

Alternativamente míralos.

https://msdn.microsoft.com/tr-tr/data/dn582034

https://msdn.microsoft.com/en-us/library/cc853327(v=vs.100).aspx