Logré reducir el tiempo total de inicio causado por EF 3 veces con estos trucos:
-
Actualice el marco a 6.2 y habilite almacenamiento en caché del modelo :
clase pública CachingContextConfiguration :DbConfiguration{public CachingContextConfiguration(){SetModelStore(new DefaultDbModelStore(Directory.GetCurrentDirectory()));}
-
Llame a
ctx.Database.Initialize()
explícitamente del nuevo hilo, tan pronto como sea posible. Esto aún toma de 3 a 4 segundos, pero como ocurre junto con otras cosas, ayuda mucho. -
Cargue entidades en la memoria caché de EF en un orden razonable.
Anteriormente, solo escribí Incluir después de Inlude, lo que se traduce en uniones múltiples. Encontré una "regla general" en algunas publicaciones de blog, que hasta dos Incluye EF encadenados funciona bastante bien, pero cada vez más ralentiza todo de forma masiva. También encontré una entrada de blog , que mostró el almacenamiento en caché de EF:una vez que se cargó la entidad dada con Incluir o Cargar, se colocará automáticamente en la propiedad adecuada (el autor del blog se equivoca sobre la unión de objetos). Así que hice esto:
using (var db = new MyContext())
{
db.Fields.Load();
db.Categories.Include(c => c.MainField).Include(x => x.Fields).Load();
db.FieldValues.Load();
return db.Objects.Include(x => x.MainFieldValue.Field).ToArray();
}
Esto está obteniendo datos 6 veces más rápido que los incluidos en la pregunta. Creo que una vez que las entidades se cargan previamente, el motor EF no llama a la base de datos para obtener objetos relacionados, solo los obtiene del caché.
-
También agregué esto en mi constructor de contexto:
Configuration.LazyLoadingEnabled = false; Configuration.ProxyCreationEnabled = false;
Los efectos de eso apenas se notan, pero pueden desempeñar un papel más importante en un gran conjunto de datos.
También he visto esto presentación de EF Core por Rowan Miller y lo cambiaré en el próximo lanzamiento; en algunos casos, es 5 o 6 veces más rápido que EF6.
Espero que esto ayude a alguien