Entity Framework 在加载 DynamicProxies 时卡住了

3
我正在尝试诊断应用程序中的严重性能问题。已经过去了将近一周,我不确定是哪里或什么导致了这个问题,除了今天我注意到以下内容:“Loaded 'EntityFrameworkDynamicProxies' line was holding up things for almost 2 minutes.” 这是什么?为什么这么慢,如何改进?

enter image description here

2个回答

1
创建POCO实体类型的实例时,Entity Framework通常会创建一个动态生成的派生类型的实例,作为实体的代理。该代理覆盖了实体的某些虚拟属性,以插入钩子以在访问属性时自动执行操作。例如,这种机制用于支持关系的惰性加载。
源:Data Developer Center 您可以通过在DbContext构造函数中设置this.Configuration.ProxyCreationEnabled = false;来禁用它。
如果禁用,则在应用程序的某个地方可能会遇到一些问题,因为现有代码依赖于惰性加载来加载相关数据。您必须通过使用显式加载或急切加载来解决这些问题。
  • 通过使用Include方法来进行急切加载(Eager Loading),如:db.Persons.Include(p => p.Cars).Include(p => p.Pets).Include(p => p.Children).Where(p => p.Id == personId);
  • 通过使用更改跟踪器和Load方法来进行显式加载(Explicit Loading),例如:db.entry(person).Collection(p => p.Cars).Load();用于集合导航属性,或者db.entry(person).Property(p => p.Home).Load();用于简单导航属性。

懒加载(Lazy Loading)、显式加载或急切加载,如果您没有正确地使用EF,则无法提高应用程序性能。请检查代码以确保您正在正确使用EF。

  • 使用 ToList(), ToArray() 等方法只执行一次查询,避免在需要重新迭代查询时向数据库发送相同的请求。
  • 不要在客户端进行过滤。确保在将查询发送到数据库之前,使用正确的过滤器创建查询。
  • 如果发现 EF 生成的 SQL 不够高效,可以为查询创建 SQL 视图。复制生成的 SQL 并在 SSMS 上分析执行计划。

根据应用程序的需求,有很多可以改进的地方。您可以使用缓存来避免未来的请求等等...


我在我的DbContext中禁用了延迟加载和代理创建,并且目前使用.Include(),这就是为什么这让我感到困惑的原因。我应该启用延迟加载吗?另外我在某个地方看到,.Include在EF上非常缓慢,这可能是我需要注意的问题吗? - devfunkd

0

对我来说,问题出在我未能正确地使用 async/await 代码!根据 OP 的说法,它由于相同的原因而挂起,但我没有收到任何错误消息。

我唯一解决这个问题的方法是在应用程序启动处设置一个断点,并逐步执行。虽然不是非常快,但也不是一个大任务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接