Успях да намаля общото начално време, предизвикано от EF 3 пъти с тези трикове:
-
Актуализирайте рамката до 6.2 и активирайте кеширане на модели :
публичен клас CachingContextConfiguration:DbConfiguration{публичен CachingContextConfiguration(){SetModelStore(нов DefaultDbModelStore(Directory.GetCurrentDirectory()));}
}
-
Извикайте
ctx.Database.Initialize()
изрично от нова тема, възможно най-рано. Това продължава да отнема 3-4 секунди, но тъй като се случва заедно с други неща, помага много. -
Заредете обекти в EF кеша в разумен ред.
Преди това току-що написах Include after Inlude, което се превежда в множество присъединявания. Намерих "основно правило" в някои публикации в блогове, че до два верижни Includes EF се представят доста добре, но всеки следващ забавя всичко масово. Намерих и публикация в блог , което показа EF кеширане:след като даден обект бъде зареден с Include или Load, той автоматично ще бъде поставен в правилното свойство (авторът на блога греши относно обединението на обекти). Така че направих това:
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();
}
Това извлича данни 6 пъти по-бързо, отколкото включва от въпроса. Мисля, че след като обектите са предварително заредени, EF машината не извиква база данни за свързани обекти, тя просто ги получава от кеша.
-
Добавих и това в моя контекстен конструктор:
Configuration.LazyLoadingEnabled = false; Configuration.ProxyCreationEnabled = false;
Ефектите от това са едва забележими, но може да играят по-голяма роля върху огромен набор от данни.
Също така гледах това представяне на EF Core от Роуън Милър и аз ще премина към него при следващата версия - в някои случаи е 5-6 пъти по-бърз от EF6.
Надявам се това да помогне на някого