Consegui reduzir o tempo total de início causado pelo EF 3 vezes com esses truques:
-
Atualize a estrutura para 6.2 e ative o model caching :
public class CachingContextConfiguration :DbConfiguration{public CachingContextConfiguration(){SetModelStore(new DefaultDbModelStore(Directory.GetCurrentDirectory()));}
}
-
Chamectx.Database.Initialize()
explicitamente do novo segmento, o mais cedo possível. Isso ainda leva de 3 a 4 segundos, mas como acontece junto com outras coisas, ajuda muito.
-
Carregue entidades no cache do EF em ordem razoável.
Anteriormente, eu apenas escrevia Incluir após Inluir, que se traduz em várias junções. Eu encontrei uma "regra geral" em algumas postagens do blog, que até dois Include EF encadeados funcionam muito bem, mas cada um diminui a velocidade de tudo massivamente. Também encontrei uma postagem de blog , que mostrava o cache do EF:uma vez que uma determinada entidade foi carregada com Include ou Load, ela será automaticamente colocada na propriedade apropriada (o autor do blog está errado sobre a união de objetos). Então eu fiz isso:
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();
}
Isso está buscando dados 6 vezes mais rápido do que inclui da pergunta. Eu acho que uma vez que as entidades são carregadas anteriormente, o mecanismo EF não chama o banco de dados para objetos relacionados, apenas os obtém do cache.
-
Eu também adicionei isso no meu construtor de contexto:
Configuration.LazyLoadingEnabled = false; Configuration.ProxyCreationEnabled = false;
Os efeitos disso são quase imperceptíveis, mas podem desempenhar um papel maior em um grande conjunto de dados.
Também assisti este apresentação do EF Core por Rowan Miller e eu mudaremos para ele na próxima versão - em alguns casos, é 5-6 vezes mais rápido que o EF6.
Espero que isso ajude alguém