2013-04-27 80 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; 
     }