2014-10-04 46 views
1

我们使用的实体框架6.1.1与像下面这样的DbContext和EntityTypeConfiguration一起将大约400个实体映射到我们的DbContext。然后,我们创建一个DbContext实例,并使用它为我们服务层中使用的每个IRepository实体创建对象集。我们无法找到解决方案的问题在于,当我们使用蚂蚁探查器时,第一次调用db需要大约18秒的时间。实体框架缓慢的第一次调用IRepository DbContext

我已经看过生成的意见,但我不能找到一种方式来做到这一点,当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; 
     } 
    } 
} 
+0

你使用AsNoTracking吗? – 2014-10-04 10:21:23

+0

我们并不是没有,因为我们利用实体跟踪进行更新和延迟加载。话虽如此,我们可以放弃这种模式,因为我不喜欢这些实体继续为数据库提供延迟加载的句柄,并确保我们调用存储库上的Update方法来重新连接实体。它会产生显着的性能差异吗? – user351711 2014-10-04 10:25:09

+0

是的,会的。实体框架会导致显着的性能问题,特别是首次调用需要很长时间。但是你可以找到很多关于这方面的资源,例如关掉AsNoTracking,当你不需要它或像预编译的查询等somothing – 2014-10-05 06:49:34

回答

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

+0

如果我错了,请纠正我,但是这些选项不要求edmx文件或DbContext在DbContext实现中使用DbSets硬编码吗?我们使用映射与IRepository模式。 – user351711 2014-10-04 16:57:54