3

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

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

是否可以记录延迟加载操作?基本上,由于延迟加载(但不是当我明确执行查询时),每当执行存储查询时,我都想 Debug.Print 。

请不要评论延迟加载的优点(或不足)。我正在开发一个相当大的应用程序,在这个阶段切换将是非常危险的。

4

2 回答 2

1

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

更具体地说,此文件DbCommandInterceptor显示了能够检测延迟加载查询的实体框架的实现。在其核心,它实现了一个ReaderExecuting包含此 hack 的方法:

        // 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;
        }
于 2017-12-04T13:00:38.937 回答
0

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

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

于 2013-04-27T19:33:05.940 回答