DbContext查询性能差与ObjectContext相比

use*_*761 18 .net c# entity-framework

我最近将我的实体模型从使用4.1的ObjectContext移动到使用5.0的DbContext.我开始后悔这样做,因为我注意到使用DbContext vs ObjectContext在查询上表现得非常糟糕.这是测试场景:

两个上下文都使用相同的数据库和大约600个表.两者都关闭了LazyLoading和ProxyCreation(代码示例中未显示).两者都有预先生成的视图.

测试首先进行1次调用以加载元数据工作区.然后在一个执行100次的for循环中,我新建一个上下文并进行一次调用,取得前10个.(我在for循环中创建上下文,因为这模拟了在WCF服务中使用,这将创建每次上下文)

for (int i = 0; i < 100; i++)
{
    using (MyEntities db = new MyEntities())
    {
        var a = db.MyObject.Take(10).ToList();
    } 
} 
Run Code Online (Sandbox Code Playgroud)

当我使用ObjectContext运行它时需要大约4.5秒.当我使用DbContext运行它需要大约17秒.我使用RedGate的性能分析器对此进行了分析.对于DbContext,似乎主要的罪魁祸首是一个名为UpdateEntitySetMappings的方法.这是在每个查询上调用的,并且似乎检索元数据工作空间并循环遍历OS空间中的每个项目.AsNoTracking没有帮助.

编辑:为了提供更好的细节,问题与DbSet与ObjectSet的创建\初始化有关,而不是实际查询.当我使用ObjectContext进行调用时,创建ObjectSet平均需要42ms.当我使用DbContext进行调用时,创建内部dbset大约需要140ms.ObjectSet和DbSet都从元数据空间做一些实体集映射查找.我注意到的是,DbSet为工作空间中的所有类型执行此操作,而ObjectSet则不会.我猜测(没有尝试过)具有较少表格的模型,性能差异较小.

Igo*_*sky 2

DbContext 是 ObjectContext 的包装器。这是关于你的问题的很好的答案。为了使使用更容易,他们可能牺牲了性能。