Предварительное создание представлений Entity Framework

Я работаю над приложением MVC 5, которое использует Entity Framework 6.1.3. Я пытаюсь оптимизировать первый вызов, который обычно занимает 1-4 секунды, путем предварительной генерации представлений. Я понимаю, почему это происходит, но чувствую, что где-то упускаю важный шаг.

Мой текущий тест запускает одну и ту же функцию пять раз, чтобы получить набор объектов из моей БД с помощью 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 => Generate Views. Файл «Model1.View.cs» был создан со строкой для каждой из моих таблиц/представлений, поэтому я чувствовал, что на правильном пути. Когда я снова провел тест, я получил те же результаты. Установка точки останова в каждом методе только что созданного файла «Model1.View.cs» показывает, что он никогда не срабатывает.

Я пропустил важный шаг здесь? Как указать EF использовать файл, созданный EF Power Tools, или как заставить работать функцию «Копировать в выходной каталог», как я читал в Интернете?


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 и хотел бы протестировать ваше решение. Куда вы добавили код Павла? В файле 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. Я не думаю, что имеет смысл запускать этот инструмент при сборке. Я думаю, что лучше всего запускать этот инструмент только в случае изменения модели. - person Pawel; 27.03.2017
comment
при использовании EFInteractiveViews контакт присваивается 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