Entity Framework Tutorial Pourquoi First Query est lent?
Pourquoi Entity Framework First Load est lent?
Entity Framework est très lent à charger pour la première fois après chaque compilation, en particulier lorsque vous avez un grand modèle.
Questions relatives à StackOverflow
Réponse
Entity Framework se charge très lentement la première fois car la première requête EF compile le modèle. Si vous utilisez EF 6.2, vous pouvez utiliser un cache de modèle qui charge un edmx pré-construit lors de l’utilisation du code en premier; au lieu de cela, EF le génère au démarrage.
public class MyDbConfiguration : DbConfiguration { public MyDbConfiguration() : base() { var path = Path.GetDirectoryName(this.GetType().Assembly.Location); SetModelStore(new DefaultDbModelStore(path)); } }
Pour accélérer le démarrage de votre application dans une version antérieure d'EF, voici trois suggestions mentionnées dans cet article.
- Utilisation d'un DbModelStore mis en cache
- Générer des vues pré-compilées
- Générer une version précompilée du framework d’entités à l’aide de NGen pour éviter le jitting
Utilisation d'un DbModelStore mis en cache
Il mettra en cache le mappage de pipeline en premier code et le stockera dans un fichier XML. Au prochain démarrage de votre application, EF désérialisera ce fichier de mappage mis en cache, ce qui réduit considérablement le temps de démarrage. Le DbModelStore mis en cache peut être activé avec les lignes de code suivantes.
public class MyContextConfiguration : DbConfiguration { public MyContextConfiguration() { MyDbModelStore cachedDbModelStore = new MyDbModelStore(MyContext.EfCacheDirPath); IDbDependencyResolver dependencyResolver = new SingletonDependencyResolver<DbModelStore>(cachedDbModelStore); AddDependencyResolver(dependencyResolver); } private class MyDbModelStore : DefaultDbModelStore { public MyDbModelStore(string location) : base(location) {} public override DbCompiledModel TryLoad(Type contextType) { string path = GetFilePath(contextType); if(File.Exists(path)) { DateTime lastWriteTime = File.GetLastWriteTimeUtc(path); DateTime lastWriteTimeDomainAssembly = File.GetLastWriteTimeUtc(typeof(MyDomain.SomeTypeInOurDomain).Assembly.Location); if (lastWriteTimeDomainAssembly > lastWriteTime) { File.Delete(path); Tracers.EntityFramework.TraceInformation("Cached db model obsolete. Re-creating cached db model edmx."); } } else { Tracers.EntityFramework.TraceInformation("No cached db model found. Creating cached db model edmx."); } return base.TryLoad(contextType); } } }
En savoir plus sur DbModelStore mis en cache
Générer des vues précompilées
La génération de vues peut améliorer considérablement les performances de démarrage. La mise en cache de cette étape est donc indispensable pour obtenir de bonnes performances de démarrage EF. Il existe différentes manières de générer et de stocker des vues précompilées telles que:
Générer une version précompilée de EF à l'aide de NGen
Entity Framework ne figure pas dans l'installation par défaut de .net Framework. Par conséquent, l'assemblage EF n'est pas défini par défaut sur NGEN, ce qui signifie que le code EF doit être JITTED à chaque démarrage de l'application.