实体框架代码第一个预先编译的视图没有加速第一次调用

时间:2014-11-21 18:58:00

标签: entity-framework ef-code-first ef-power-tools

我在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>

2 个答案:

答案 0 :(得分:0)

它们是两个独立的问题。预编译视图不会创建执行计划。执行计划是第一次请求的大部分时间。预编译视图会有所帮助,但大部分时间都不会占用。

答案 1 :(得分:0)

通过各种搜索术语在互联网上挖掘后,我能够解决这个问题。如果您的实体与数据上下文不在同一程序集中,则使用预编译视图会出现问题。这个问题在这里描述:

Which assembly should I place the compiled views for entity framework code first when context is in a separate project from the domain classes

有一种解决方法,但是,我发现它非常黑客。上下文中定义的第一个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]");