Udało mi się skrócić całkowity czas startu spowodowany przez EF 3 razy dzięki tym sztuczkom:
-
Zaktualizuj framework do wersji 6.2 i włącz buforowanie modelu :
public class CachingContextConfiguration :DbConfiguration{public CachingContextConfiguration(){SetModelStore(new DefaultDbModelStore(Directory.GetCurrentDirectory()));}
}
-
Wywołaj
ctx.Database.Initialize()
wyraźnie z nowego wątku, tak wcześnie, jak to możliwe. To nadal zajmuje 3-4 sekundy, ale ponieważ dzieje się to razem z innymi rzeczami, bardzo pomaga. -
Załaduj jednostki do pamięci podręcznej EF w rozsądnej kolejności.
Wcześniej napisałem po prostu Include po Inlude, co przekłada się na wielokrotne sprzężenia. Znalazłem "zasadę" w niektórych postach na blogu, że do dwóch połączonych EF działa całkiem dobrze, ale każdy kolejny znacznie spowalnia wszystko. Znalazłem też post na blogu , który pokazał buforowanie EF:po załadowaniu danej encji za pomocą opcji Include lub Load zostanie ona automatycznie umieszczona we właściwej właściwości (autor bloga myli się co do unii obiektów). Więc zrobiłem to:
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();
}
Pobiera to dane 6 razy szybciej niż obejmuje z pytania. Myślę, że po wcześniejszym załadowaniu encji silnik EF nie wywołuje bazy danych dla powiązanych obiektów, po prostu pobiera je z pamięci podręcznej.
-
Dodałem to również w moim konstruktorze kontekstu:
Configuration.LazyLoadingEnabled = false; Configuration.ProxyCreationEnabled = false;
Efekty tego są ledwo zauważalne, ale mogą odgrywać większą rolę w ogromnym zbiorze danych.
Oglądałem też to prezentacja EF Core autorstwa Rowana Millera i przejdę na niego w następnym wydaniu - w niektórych przypadkach jest 5-6 razy szybszy niż EF6.
Mam nadzieję, że to komuś pomoże