实体框架挂起在加载的DynamicProxies上

时间:2015-11-10 23:03:05

标签: c# asp.net sql-server entity-framework

我正在尝试在我的应用程序中诊断严重的性能问题。它差不多一周了,我不知道在哪里或是什么导致它,除了今天我注意到以下" Loaded' EntityFrameworkDynamicProxies'线路阻挡了近2分钟。这是什么?为什么这么慢,我该如何改进呢?

enter image description here

2 个答案:

答案 0 :(得分:0)

  

在创建POCO实体类型的实例时,实体框架通常会创建动态生成的派生类型的实例,该类型充当实体的代理。此代理会覆盖实体的某些虚拟属性,以插入用于在访问属性时自动执行操作的挂钩。例如,此机制用于支持延迟加载关系。

来源:Data Developer Center

您可以在this.Configuration.ProxyCreationEnabled = false;构造函数中设置此行DbContext来禁用它。

如果禁用,当现有代码依赖Lazy Loading加载相关数据时,您的应用程序中可能会遇到一些问题。您必须使用Explicit LoadEager Load修复这些问题。

  • 急切加载,使用Include的{​​{1}}方式DbSet
  • 明确加载在您的条目中使用更改跟踪器和db.Persons.Include(p => p.Cars).Include(p => p.Pets).Include(p => p.Children).Where(p => p.Id == personId);方法,如下所示:Load用于收集导航属性,或db.entry(person).Collection(p => p.Cars).Load();用于简单的导航属性。

延迟加载,显式加载或预先加载,如果您没有正确使用EF,则没有灵丹妙药可以提高您的应用程序性能。您的代码中有一些要检查的内容,以确保您:

  • 使用db.entry(person).Property(p => p.Home).Load();ToList()等...仅执行一次查询,并在需要重新查询时阻止对数据库的相同请求。
  • 不在客户端过滤。我的意思是确保在向数据库发送查询之前使用正确的过滤器创建查询。
  • 如果您发现EF生成的SQL效率不高,则
  • 为查询创建SQL视图。复制生成的SQL并分析SSMS上的执行计划。

根据您的应用程序正在做什么和需要,有许多事情可以改进。您可以使用缓存来避免将来的请求等...

答案 1 :(得分:0)

对我来说,问题是由于我使用不当的异步/等待代码!根据OP,它出于同样的原因挂起,但我收到了0条错误消息。

我能解决问题的唯一方法就是坚持应用程序启动并逐步完成的断点。它不是超级快,但它也不是一个大任务。