Entity Framework Code Первые предварительно скомпилированные представления не ускоряют первый вызов

Я использовал EF PowerTools (EF5) в VS2012 для создания предварительно скомпилированных представлений для моего большого DataContext с первым кодом. К сожалению, это не помогло ускорить первый вызов контекста данных. Это все еще занимает около 13 секунд. Есть ли какие-то соображения относительно использования предварительно скомпилированных представлений, которые я не принимаю во внимание? Я не использую миграции, и я отключаю инициализацию базы данных.

<connectionStrings>
    <add name="MyDataContext" connectionString="..." providerName="System.Data.SqlClient" />
</connectionStrings>

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <contexts>
        <context type="MyNameSpace.MyDataContext, MyNameSpaceAssembly" disableDatabaseInitialization="true" />
    </contexts>
</entityFramework>

2 ответа

Решение

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

Какую сборку я должен поместить скомпилированными представлениями для кода платформы сущностей первым, когда контекст находится в отдельном проекте от классов домена

Есть обходной путь, однако, я считаю, что это довольно взломать. Первый объект DbSet, определенный в контексте, должен находиться в той же сборке, что и DataContext. Я создал этот класс произвольной сущности в сборке моего контекста:

public class PreCompiledView
{
    public int PreCompiledViewId { get; set; }
}

и добавил DbSet в мой контекст:

public class MyDataContext : DbContext
{
    #region DBSets

    // HACK: Enable pre-compiled views
    internal DbSet<PreCompiledView> PreCompiledViews { get; set; }

    // My entity sets
    public DbSet<MyOtherAssemblyEntity> MyOtherAssemblyEntities { get; set; }
    ...

    #endregion
}

Мои предварительно скомпилированные представления теперь отражаются и используются текстовым текстом. В моем пользовательском переопределении инициализатора базы данных Seed() я выполняю оператор SQL DROP, чтобы удалить таблицу dbo.PrecompiledViews, чтобы скрыть ее от разработчиков.

context.Database.ExecuteSqlCommand("DROP TABLE [dbo].[PreCompiledViews]");

Это две разные проблемы. Прекомпиляция представлений не создает план выполнения. План выполнения - это то, что занимает большую часть времени по первому запросу. Прекомпиляция представлений помогает, но это не то, что занимает большую часть времени.

Другие вопросы по тегам