Entity Framework Perché First Query è lento?
Perché il primo caricamento di Entity Framework è lento?
Il framework Entity è molto lento da caricare per la prima volta dopo ogni compilation, specialmente quando si dispone di un modello di grandi dimensioni.
Domande relative a StackOverflow
Risposta
Entity Framework viene caricato molto lentamente la prima volta poiché la prima query EF compila il modello. Se si utilizza EF 6.2, è possibile utilizzare un Model Cache che carica un edmx precostruito quando si utilizza il codice per primo; invece, EF lo genera all'avvio.
public class MyDbConfiguration : DbConfiguration
{
public MyDbConfiguration() : base()
{
var path = Path.GetDirectoryName(this.GetType().Assembly.Location);
SetModelStore(new DefaultDbModelStore(path));
}
}
Per velocizzare il tempo di avvio dell'applicazione in una versione precedente di EF, ecco tre suggerimenti menzionati in questo post.
- Utilizzo di un DbModelStore memorizzato nella cache
- Genera viste precompilate
- Generare una versione precompilata del framework di entità usando NGen per evitare di fare jitting
Utilizzo di un DbModelStore memorizzato nella cache
Memorizzerà in cache la mappatura della prima pipeline in codice e la memorizzerà in un file XML. Al prossimo avvio dell'applicazione, EF deserializzerà questo file di mappatura memorizzato nella cache che riduce significativamente il tempo di avvio. Il DbModelStore memorizzato nella cache può essere abilitato con le seguenti righe di codice.
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);
}
}
}
Ulteriori informazioni su DbModelStore memorizzato nella cache
Genera viste precompilate
La generazione delle viste può avere un miglioramento significativo delle prestazioni di avvio, quindi la memorizzazione nella cache di questo passaggio è indispensabile per ottenere buone prestazioni di avvio EF. Esistono diversi modi per generare e archiviare viste precompilate come;
Generare la versione pre-compilata di EF usando NGen
Entity Framework non è incluso nell'installazione predefinita di .net Framework. Pertanto, l'assemblaggio EF non è NGEN per impostazione predefinita, il che significa che il codice EF deve essere JITTED ogni volta che si avvia l'applicazione.