我在VS2012中使用EF PowerTools(EF5)为我的大型代码优先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>
答案 0 :(得分:0)
它们是两个独立的问题。预编译视图不会创建执行计划。执行计划是第一次请求的大部分时间。预编译视图会有所帮助,但大部分时间都不会占用。
答案 1 :(得分:0)
通过各种搜索术语在互联网上挖掘后,我能够解决这个问题。如果您的实体与数据上下文不在同一程序集中,则使用预编译视图会出现问题。这个问题在这里描述:
有一种解决方法,但是,我发现它非常黑客。上下文中定义的第一个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
}
我的预编译视图现在由datacontext反映和使用。在我的自定义数据库初始化程序Seed()覆盖中,我执行SQL DROP语句以删除dbo.PrecompiledViews表,以使其对开发人员隐藏。
context.Database.ExecuteSqlCommand("DROP TABLE [dbo].[PreCompiledViews]");