我将实体框架5与POCO实体和延迟加载代理一起使用。在大多数情况下,我急切地加载后续操作所需的所有实体,但在某些情况下,我依赖于延迟加载来检索和导航到相关实体。这很好用,但我想审核我的应用程序,并确保我不会错过急切加载优化的机会(或者至少消除过多使用延迟加载)。
我目前依赖SQL Profiler来实现此目的,但这很乏味,因为很难区分eager / explicit加载和延迟加载查询。
是否可以记录延迟加载操作?基本上,我想在执行商店查询时调试Debug.Print,因为延迟加载(但不是在我显式执行查询时)。
请不要对延迟加载的优点(或缺点)提供评论。我正在开发一个相当大的应用程序,在这个阶段进行切换会非常危险。
答案 0 :(得分:0)
我使用这个工具。 https://code.google.com/p/mvc-mini-profiler/你可以从Nuget那里得到它。适用于MVC和桌面应用程序(搜索命令应用程序的迷你探查器)。告诉你SQL,执行时间和调用它的代码。自由。优秀的工具。
它不会告诉您哪个查询是延迟加载的,但您可以定位代码的特定部分,因此您应该能够看到哪些代码调用哪些查询。
答案 1 :(得分:0)
我建议您查看此库:https://github.com/jamesmanning/EntityFramework.LazyLoadLoggingInterceptor
更具体地说,this file显示了能够检测延迟加载查询的实体框架DbCommandInterceptor
的实现。从本质上讲,它实现了一个包含此hack的ReaderExecuting
方法:
// unfortunately not a better way to detect whether the load is lazy or explicit via interceptor
var stackFrames = new StackTrace(true).GetFrames();
var stackMethods = stackFrames?.Select(x => x.GetMethod()).ToList();
var dynamicProxyPropertyGetterMethod = stackMethods?
.FirstOrDefault(x =>
x.DeclaringType?.FullName.StartsWith("System.Data.Entity.DynamicProxies") == true &&
x.Name.StartsWith("get_"));
if (dynamicProxyPropertyGetterMethod == null)
{
// not in a lazy-load context, nothing to do
return;
}