实体框架慢速调用IRepository DbContext

时间:2014-10-04 09:55:03

标签: c# performance entity-framework

我们正在使用实体框架6.1.1和下面的DbContext以及EntityTypeConfiguration将大约400个实体映射到我们的DbContext。然后,我们创建DbContext的一个实例,并使用它为我们在服务层中使用的每个IRepository实体创建对象集。我们无法找到解决方案的问题是,当我们使用Ants剖析器时,对db的第一次调用大约需要18秒。

我已经考虑过生成视图,但是当DbContext不包含对实体的硬编码DbSet集合时,我找不到一种方法。有没有办法用我们的模式预先生成视图?如果有,我们会看到显着的性能提升吗?

或者是时候走另一条路了,我们是否应该在逻辑分离上为数据库的特定区域创建更小的DbContexts?

  public class Context: DbContext
  {
#pragma warning disable
    Type dummyType_SqlProviderServices = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
#pragma


static Context()
{
  Database.SetInitializer(new ContextatabaseInitializer<Context>());

}

public Context(DbConnection con)
  : base(con, false)
{
}

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
    modelBuilder.Configurations.AddFromAssembly(typeof(ZincContext).Assembly);      
    base.OnModelCreating(modelBuilder);
  }
}

public class EntityRepository<T> : IEntityRepository<T> where T : class
{
    protected IDbSet<T> ObjectSet
    {
      get
      {
        if (_objectSet == null)
        {
          _objectSet = this.DbContext.Set<T>();
        }
        return _objectSet;
      }
    }
}

1 个答案:

答案 0 :(得分:0)

在应用程序首次执行查询时,基于实体模型生成视图是一项重大成本。使用EdmGen.exe实用程序将视图预生成为可在设计期间添加到项目中的Visual Basic或C#代码文件。您还可以使用文本模板转换工具包来生成预编译的视图。预生成的视图在运行时进行验证,以确保它们与指定实体模型的当前版本一致。有关更多信息,请参见如何:

Pre-Generate Views to Improve Query Performance (Entity Framework)

Isolating Performance with Precompiled/Pre-generated Views in the Entity Framework 4

ENTITY FRAMEWORK CODE FIRST VIEW GENERATION TEMPLATES ON VISUAL STUDIO CODE GALLERY