2014-11-21 55 views
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> 

回答

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]"); 
0

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

+0

嗯,我想还有更多的事情要做。首先,有无视图的时间几乎相同。其次,我刚刚意识到,我忘了重新编译最近添加一个新的实体属性的意见。在引用我的EF程序集的项目中,我实际上可以使用新属性加载实体,进行设置并保存成功。如果预编译的视图没有使用新的属性/列产生,甚至可能这样做? – 2014-11-24 21:21:40

+0

不,您应该在运行应用程序时收到异常,并且在更改模型后没有重新编译视图。 – 2014-11-24 21:26:20

+0

是的,这就是我的想法。我的故障排除似乎表明这些视图没有被使用。我试图找出原因。我右键单击我的上下文,选择实体框架=>生成视图。我不知道是否还有更多。 – 2014-11-24 21:33:57