EF 4.1 Code-first выполняет запросы в 3 раза медленнее, чем обычный EF в моем приложении

У меня есть домашний проект (простое приложение для форума), который я использую для тестирования всех новейших технологий .NET, и недавно я попробовал Entity Framework Code-First. Это приложение уже имело существующее EF-решение с EDMX-файлом, сопоставленным с существующей базой данных, и все мои сущности были автоматически сгенерированы. Это решение отлично работает до сих пор.

Примечание: Имейте в виду, что этот переход на EF 4.1 предназначен исключительно для обучения. Если вы задаетесь вопросом, какие потребности заставили меня перейти на новую версию, то их не было. Я просто хотел сделать это для удовольствия.

Я скопировал проект и сделал обновления, чтобы у меня был один и тот же проект, но с разными реализациями Entity Framework. В новом проекте я использовал расширение Visual Studio под названием Entity Framework Power Tools для генерации POCO и DbContext из существующей базы данных. Все работало безупречно. Приложение скомпилировалось примерно за 30 минут. Довольно впечатляюще.

Однако теперь при запуске приложения я заметил, что выполнение запросов происходит примерно в 3 раза медленнее, чем раньше. Есть идеи, что я мог упустить?

Ниже приведены детали для обоих решений, а также измерения LINQPad для обоих. (щелкните изображения для полного размера)

Детали EF 4.0

Вот снимок моей модели данных EF 4.0. Он обрезает несколько сущностей сверху и снизу, но вы поняли идею.

http://www.codetunnel.com/content/images/EF41question/1.jpg Вот тест LINQPad против моей модели данных EF 4.0.

http://www.codetunnel.com/content/images/EF41question/2.jpg Обратите внимание, что на выполнение запроса ушло 2,743 секунды.

EF 4.1 Details

Вот снимок моей модели данных EF 4.1. Поскольку это только код, я покажу класс DbContext, а также один из классов отображения (fluent API код) для одной сущности и саму сущность.

DbContext http://www.codetunnel.com/content/images/EF41question/3.jpg TopicMap (конфигурация fluent API) http://www.codetunnel.com/content/images/EF41question/4.jpg Topic (сущность POCO) http://www.codetunnel.com/content/images/EF41question/5.jpg Вот тест LINQPad против моей модели EF 4.1.

http://www.codetunnel.com/content/images/EF41question/6.jpg Обратите внимание, что на этот раз выполнение запроса заняло 6,287 секунды, и это был точно такой же запрос. При первом запуске он занимает более 30 секунд. Если я перейду на вкладки SQL и IL в LINQPad, то сгенерированный SQL и IL-код идентичны для обеих моделей данных. Это действительно не дает мне покоя. В реальном приложении все работает настолько медленно с EF 4.1, что его невозможно использовать.

Я выполнил один и тот же LINQ-запрос для обеих моделей. Запрос берет все темы для обычного пользователя форума, упорядочивает их в порядке убывания по дате последнего ответа (или по дате сообщения темы, если ответов нет).

Понятно, что я могу просто вернуться к EF 4.0 и продолжать свой веселый путь, но мне очень интересно, может быть, я что-то упустил.

11
задан halfer 20 September 2018 в 14:34
поделиться