Pomocí těchto triků se mi podařilo zkrátit celkový čas startu způsobený EF 3krát:
-
Aktualizujte framework na 6.2 a povolte ukládání modelu do mezipaměti :
veřejná třída CachingContextConfiguration :DbConfiguration{public CachingContextConfiguration(){SetModelStore(new DefaultDbModelStore(Directory.GetCurrentDirectory()));}
}
-
Zavolejte
ctx.Database.Initialize()
explicitně z nového vlákna, co nejdříve. Stále to trvá 3–4 sekundy, ale protože se to děje vedle jiných věcí, hodně to pomáhá. -
Načtěte entity do mezipaměti EF v rozumném pořadí.
Dříve jsem jen napsal Include po Inlude, což se převádí do více spojení. Na některých příspěvcích na blogu jsem našel „pravidlo“, že až dva zřetězené EF zahrnují poměrně dobře, ale každý další vše masivně zpomaluje. Také jsem našel příspěvek na blogu , který ukázal EF caching:jakmile byla daná entita načtena pomocí Include nebo Load, bude automaticky vložena do správné vlastnosti (autor blogu se mýlí ve spojení objektů). Tak jsem udělal toto:
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();
}
To je načítání dat 6krát rychleji, než zahrnuje otázka. Myslím, že jakmile jsou entity dříve načteny, EF engine nevolá databázi souvisejících objektů, pouze je získá z mezipaměti.
-
Také jsem to přidal do svého kontextového konstruktoru:
Configuration.LazyLoadingEnabled = false; Configuration.ProxyCreationEnabled = false;
Účinky toho jsou sotva patrné, ale mohou hrát větší roli u obrovského souboru dat.
Také jsem sledoval toto prezentace EF Core od Rowana Millera a v příštím vydání na něj přejdu - v některých případech je 5-6krát rychlejší než EF6.
Doufám, že to někomu pomůže