2013-04-27 46 views
2

我使用实体框架5与POCO实体和延迟加载代理。在大多数情况下,我急切地加载后续操作所需的所有实体,但在某些情况下,我依靠延迟加载来检索并导航到相关实体。这很好,但我想审核我的应用程序,并确保我不会错过加载优化的机会(或至少消除过度使用延迟加载)。日志延迟加载操作

我目前依靠SQL Profiler来达到这个目的,但这很乏味,因为很难区分急切/显式加载和延迟加载查询。

是否可以记录延迟加载操作?基本上,我希望Debug.Print在执行商店查询时作为延迟加载的结果(但不是在我明确执行查询时)。

请不要提供关于延迟加载的优点(或缺乏)的评论。我正在研究一个大规模的应用程序,在这个阶段切换会非常危险。

回答

0

我使用这个工具。 https://code.google.com/p/mvc-mini-profiler/你可以从Nuget中获得它。适用于MVC和桌面应用程序(搜索用于命令应用程序的mini profiler)。告诉你SQL,执行时间和代码被调用的地方。自由。优秀的工具。

它不会告诉你哪个查询是延迟加载的,但是你可以指定特定部分的代码,因此你应该能够看到哪些代码调用哪些查询。

0

我建议你检查出这个库:https://github.com/jamesmanning/EntityFramework.LazyLoadLoggingInterceptor

更具体地说,this file显示了实体框架DbCommandInterceptor能够检测延迟加载查询的实现。在其核心,它实现了一个包含此黑客的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; 
     }