muy lento carga c# sql-server entity-framework

c# - mi wordpress carga muy lento



Entity Framework es muy lento para cargar por primera vez despuĆ©s de cada compilaciĆ³n (6)

Con EF Core, puede hacer trampa y cargar el modelo poco después de llamar a los services.AddDbContext AgregarDbContext (probablemente también pueda hacer algo similar con EF6, pero no lo he probado).

services.AddDbContext<MyDbContext>(options => ...); var options = services.BuildServiceProvider() .GetRequiredService<DbContextOptions<MyDbContext>>(); Task.Run(() => { using(var dbContext = new MyDbContext(options)) { var model = dbContext.Model; //force the model creation } });

Esto creará el modelo del dbcontext en otro hilo mientras se realiza el resto de la inicialización de la aplicación (y quizás otros calentamientos) y el comienzo de una solicitud. De esta manera, estará listo antes. Cuando lo necesite, EFCore esperará a que se cree el Modelo si aún no ha terminado. El Model se comparte en todas las instancias de DbContext, por lo que está bien disparar y olvidar este dbcontext ficticio.

Como sugiere el título, tengo un problema con la primera consulta en una base de datos de SQL Server que usa Entity Framework. He intentado 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 precompilar las vistas. La base de datos estaba en un SQL Server 2008. Tenemos alrededor de 400 POCO (400 archivos de mapeo), solo tenemos datos de 100 filas 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<Table1>.FirstOrDefault(); st.stop(); Console.WriteLine("First Time "+st.ElapsedMilliseconds+ " milliseconds"); st.Reset(); st.Start(); new TestDbContext().Set<Table1>.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 compila el modelo. Esto puede llevar 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. Usar una tienda de modelos db en caché
  2. Generar vistas precompiladas
  3. Genere una versión precompilada del marco de la entidad utilizando n-gen para evitar sacudidas

También me aseguraría de compilar la aplicación en modo de lanzamiento al hacer los puntos de referencia.

Otra solución es considerar dividir el DBContext. 400 entidades es mucho y debería ser mejor trabajar con fragmentos más pequeños. No lo he probado, pero supongo que sería posible construir los modelos uno por uno, lo que significa que ninguna carga lleva 15 segundos. Ver esta publicación de Julie Lerman https://msdn.microsoft.com/en-us/magazine/jj883952.aspx


Puedes probar 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


Si tiene muchas tablas que no se usan en c #, excluyalas.

Agregue una clase parcial, agregue el siguiente código y haga referencia a esta función en OnModelCreating

void ExcludedTables(DbModelBuilder modelBuilder) { modelBuilder.Ignore<Table1>(); modelBuilder.Ignore<Table>(); // And so on }


este trabajo para mi:

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(); }