Подтвердить что ты не робот

EF6/Code First: Супер медленный во время первого запроса, но только в Debug

Я использую EF6 rc1 со стратегией Code First без предварительно скомпилированных представлений, и проблема такова: Если я компилирую и запускаю exe-приложение, для запуска первого запроса требуется 15 секунд (это нормально, так как я все еще работаю над предварительно сгенерированными представлениями). Но если я использую Visual Studio 2013 Preview для отладки точно такого же приложения, он занимает почти 2 минуты, прежде чем запускать первый запрос:

Dim Context = New MyEntities()
Dim Query = From I in Context.Itens '' <--- The debug takes 2 minutes in here
Dim Item = Query.FirstOrDefault()

Есть ли способ удалить это дополнительное время? Я здесь что-то не так?

Ps: Сам контекст не сложный, его просто полный 200 + таблиц.

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

IQueryProvider IQueryable.Provider
    {
        get
        {
            return _provider ?? (_provider = new DbQueryProvider(
                                                 GetInternalQueryWithCheck("IQueryable.Provider").InternalContext,
                                                 GetInternalQueryWithCheck("IQueryable.Provider").ObjectQueryProvider));
        }
    }

где время потребляется. Но это странно, поскольку для отладки требуется только время. Я что-то пропустил?

Изменить: Найдено больше информации, связанной с вопросом: Используя Process Monitor (Sysinternals), я узнал, что существует его процесс desenv.exe, который потребляет массу времени. Чтобы быть более конкретным, это время его потребления с помощью "Thread Exit". Он повторяет стек потока выхода 36 раз. Я не знаю, действительно ли эта информация очень полезна, но я сохранил ".cvs" со стеком, вот его тело: [...] (отредактируйте: удалил тело ".cvs", я могу опубликовать его снова по комментариям, если кто-то действительно подумает, что это будет полезно, но оно было путаным и слишком большим.)

Изменить: установлен VS2013 Ultimate и Entity Framework 6 RTM. Установил бета-версию 4 Power Tools платформы Entity Framework и использовал ее для создания представлений. Ничего не изменилось... Если я запустил exe, это займет 20 секунд, если я начну отлаживать, это займет 120 секунд.

Изменить: Создал небольшой проект для моделирования ошибки: http://sdrv.ms/16pH9Vm Просто запустите проект внутри среды и непосредственно через .exe, нажмите кнопку и сравните время загрузки.

4b9b3361

Ответ 1

Это известная проблема с производительностью в Lazy (которую использует EF) при подключении отладчика. В настоящее время мы работаем над исправлением (текущий подход, на который мы смотрим, устраняет использование Lazy). Мы надеемся скоро отправить это исправление в выпуск исправлений. Вы можете отслеживать ход этой проблемы на нашем сайте CodePlex - http://entityframework.codeplex.com/workitem/1778.

Подробнее о предстоящем выпуске патча 6.0.2, который будет содержать исправление, здесь - http://blogs.msdn.com/b/adonet/archive/2013/10/31/ef6-performance-issues.aspx

Ответ 2

Я не знаю, нашли ли вы решение. Но в моем случае у меня была аналогичная проблема, которая впустую пропустила меня примерно через неделю после того, как я попробовал разные предложения. Наконец, я нашел решение, изменив свой web.config на optimizeCompilations = "true", и производительность резко улучшилась с 15-30 секунд до 2 секунд.