Det lykkedes mig at reducere den samlede starttid forårsaget af EF 3 gange med disse tricks:
-
Opdater rammeværket til 6.2 og aktiver modelcaching :
public class CachingContextConfiguration :DbConfiguration{public CachingContextConfiguration(){SetModelStore(new DefaultDbModelStore(Directory.GetCurrentDirectory()));}
}
-
Kald
ctx.Database.Initialize()
eksplicit fra ny tråd, så tidligt som muligt. Dette tager stadig 3-4 sekunder, men da det sker sammen med andre ting, hjælper det meget. -
Indlæs enheder i EF-cache i rimelig rækkefølge.
Tidligere har jeg bare skrevet Inkluder efter Inlude, som udmønter sig i multiple joins. Jeg fandt en "tommelfingerregel" på nogle blogindlæg om, at op til to kædede Includes EF klarer sig ret godt, men hver gang sinker alting massivt. Jeg fandt også et blogindlæg , der viste EF-cache:når en given enhed blev indlæst med Include eller Load, vil den automatisk blive sat i den rigtige egenskab (blogforfatteren tager fejl med hensyn til forening af objekter). Så jeg gjorde dette:
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();
}
Dette henter data 6 gange hurtigere end inkluderet fra spørgsmålet. Jeg tror, at når entiteter først er indlæst tidligere, kalder EF-motoren ikke database for relaterede objekter, den henter dem bare fra cachen.
-
Jeg tilføjede også dette i min kontekstkonstruktør:
Configuration.LazyLoadingEnabled = false; Configuration.ProxyCreationEnabled = false;
Effekter af det er knapt mærkbare, men kan spille en større rolle på enorme datasæt.
Jeg har også set dette præsentation af EF Core af Rowan Miller, og jeg vil skifte til den ved næste udgivelse - i nogle tilfælde er det 5-6 gange hurtigere end EF6.
Håber dette hjælper nogen