我正在尝试在我的应用程序中诊断严重的性能问题。它差不多一周了,我不知道在哪里或是什么导致它,除了今天我注意到以下" Loaded' EntityFrameworkDynamicProxies'线路阻挡了近2分钟。这是什么?为什么这么慢,我该如何改进呢?
答案 0 :(得分:0)
在创建POCO实体类型的实例时,实体框架通常会创建动态生成的派生类型的实例,该类型充当实体的代理。此代理会覆盖实体的某些虚拟属性,以插入用于在访问属性时自动执行操作的挂钩。例如,此机制用于支持延迟加载关系。
您可以在this.Configuration.ProxyCreationEnabled = false;
构造函数中设置此行DbContext
来禁用它。
如果禁用,当现有代码依赖Lazy Loading
加载相关数据时,您的应用程序中可能会遇到一些问题。您必须使用Explicit Load
或Eager 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()
等...仅执行一次查询,并在需要重新查询时阻止对数据库的相同请求。根据您的应用程序正在做什么和需要,有许多事情可以改进。您可以使用缓存来避免将来的请求等...
答案 1 :(得分:0)
对我来说,问题是由于我使用不当的异步/等待代码!根据OP,它出于同样的原因挂起,但我收到了0条错误消息。
我能解决问题的唯一方法就是坚持应用程序启动并逐步完成的断点。它不是超级快,但它也不是一个大任务。