Предварително генериране на изгледи на Entity Framework

Работя върху MVC 5 приложение, което използва Entity Framework 6.1.3. Опитвам се да оптимизирам първото обаждане, което обикновено отнема 1-4 секунди, като предварително генерирам изгледите. Разбирам защо се случва това, но имам чувството, че някъде пропускам важна стъпка.

Текущият ми тест изпълнява същата функция пет пъти, за да изтегли колекция от обекти от моята DB с помощта на EF. Когато стартирам това с „Вграждане в изходна директория“, зададено в моя edmx, получавам следните резултати:

**

  • Първо EF повикване: 2617 милисекунди
  • Второ EF повикване: 19 милисекунди
  • Трето EF повикване: 19 милисекунди
  • Четвърто EF повикване: 17 милисекунди
  • Пето EF повикване: 20 милисекунди

**

Очаквам това, тъй като EF генерира локалните изгледи за достъп до базата данни...

Когато превключа на „Копиране в изходна директория“, проверете отново дали файловете ми се копират в папката bin и низът ми за връзка е актуализиран, след което изпълнете същия тест и получавам подобни резултати:

**

  • Първо EF повикване: 2546 милисекунди
  • Второ EF повикване: 19 милисекунди
  • Трето EF повикване: 18 милисекунди
  • Четвърто EF повикване: 18 милисекунди
  • Пето EF повикване: 21 милисекунди

**

Няма промяна при първото обаждане, което е странно. Добавих EF Power Tools, щракнах с десния бутон върху моя edmx => Entity Framework => Генериране на изгледи. Беше създаден файл „Model1.View.cs“ с низ за всяка от моите таблици/изгледи, така че почувствах, че съм на прав път. Когато пуснах теста отново, получих същите резултати. Поставянето на точка на прекъсване във всеки метод на новогенерирания файл „Model1.View.cs“ показва, че той никога не е ударен.

Пропускам ли важна стъпка тук? Как да кажа на EF да използва файла, създаден от EF Power Tools, или как да накарам Copy to Output Directory да работи, както съм чел онлайн?


person Matthew Meppiel    schedule 23.06.2015    source източник


Отговори (1)


Доколкото си спомням, EF Power Tools не беше актуализиран, за да поддържа EF6. Ако сте сигурни, че това е генерирането на изгледи, което причинява проблема, можете или да използвате генерирането на изгледи T4 шаблон или интерактивните предварително генерирани изгледи (да, аз създател съм и на двете). Можете да намерите повече подробности за това как да използвате шаблона T4 в тази публикация. Интерактивните предварително генерирани изгледи са описани тук.

Генерирането на изгледи в EF6 обаче беше значително подобрено и е проблем само за по-големи модели или когато са включени сложни йерархии. Предполагам, че затруднението, което виждате, не е причинено от генериране на изгледи, а от изграждане на модел. Разгледайте тази публикация от екипа на EF, който говори малко за подобряване на производителността при стартиране чрез генериране на оригинални изображения. Може също да искате да разгледате Съображение за производителността.

person Pawel    schedule 24.06.2015
comment
Включих интерактивни предварително генерирани изгледи и генерирани собствени изображения и първото ми обаждане беше намалено до 458 милисекунди. Ти си страхотен. - person Matthew Meppiel; 24.06.2015
comment
Здравей Матю, работя върху ASP.NET MVC приложение и бих тествал твоето решение. Къде добавихте кода на Pawel? Във файла Global.asax? Дефинирах контекста на базата данни и edmx във външна dll. Благодаря предварително. - person jacktric; 13.08.2016
comment
В допълнение: ако поставя кода в Global.asax, получавам следното съобщение за изключение: Контекстът се използва в режим Code First с код, който е генериран от EDMX файл за разработка на Database First или Model First. Това няма да работи правилно. За да коригирате този проблем, не премахвайте реда от код, който хвърля това изключение. Ако искате да използвате Database First или Model First, тогава се уверете, че низът за свързване на Entity Framework е включен в app.config или web.config на стартиращия проект. Ако създавате своя собствена DbConnection, уверете се, че тя е E... - person jacktric; 13.08.2016
comment
Павел, сега на Visual Studio 2017, може ли вашата библиотека да се използва безопасно в най-новата версия на Entity Framework (6.1.3)? - person Tony; 25.03.2017
comment
@Tony - Мисля, че може да се наложи да актуализирам vsix, в противен случай може да не се инсталира - person Pawel; 25.03.2017
comment
Можете ли да актуализирате vsix? Бих искал да го изтегля и да го използвам на VS 2017. Мога ли да автоматизирам генерирането на изходния код T4 по време на BUILD? - person Tony; 25.03.2017
comment
Актуализирах разширението във VS gallery. Не мисля, че има много смисъл да стартирате този инструмент при компилация. Мисля, че най-добрият начин е да стартирате този инструмент само ако моделът се промени. - person Pawel; 27.03.2017
comment
докато използвам EFInteractiveViews, contaxt се присъединява към InteractiveViews.SetViewCacheFactory при използване на блок, но в моя код db contaxt се създава по този начин MyDbContext db = new MyDbContext(); в горната част на контролера, как мога да внедря InteractiveViews. Благодаря - person sairfan; 13.09.2018
comment
Измервали ли сте дали генерирането на изгледи има някаква разлика във вашия случай? Тъй като за по-малките бази данни няма разлика, така че може да не си струва караницата. - person Pawel; 13.09.2018
comment
можете ли да деактивирате използването на изгледи чрез запис в конфигурацията? - person T McKeown; 13.11.2018