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则不会.我猜测(没有尝试过)具有较少表格的模型,性能差异较小.
| 归档时间: |
|
| 查看次数: |
2990 次 |
| 最近记录: |