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]");
Это две разные проблемы. Прекомпиляция представлений не создает план выполнения. План выполнения - это то, что занимает большую часть времени по первому запросу. Прекомпиляция представлений помогает, но это не то, что занимает большую часть времени.