0

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

2 回答 2

0

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

于 2014-11-24T18:03:50.363 回答
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
}

我的预编译视图现在由数据上下文反映和使用。在我的自定义数据库初始化程序 Seed() 覆盖中,我执行 SQL DROP 语句以删除 dbo.PrecompiledViews 表,以使其对开发人员隐藏。

context.Database.ExecuteSqlCommand("DROP TABLE [dbo].[PreCompiledViews]");
于 2014-11-24T23:23:04.270 回答