entity-framework - 记录延迟加载操作

标签 entity-framework lazy-loading

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

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

是否可以记录延迟加载操作?基本上,由于延迟加载(但不是在我显式执行查询时),我想在执行商店查询时调试。

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

最佳答案

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

更具体地说,this file显示了能够检测延迟加载查询的 Entity Framework 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;
        }

关于entity-framework - 记录延迟加载操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16246985/

相关文章:

entity-framework - EF 代码优先 : Get all POCO types for DbContext

jQuery 自定义滚动条和延迟加载

java - 如何延迟加载 uibinded GWT 编辑器

android - 在 Picasso Android 中实现 "withDelay"(用于略读)

c# - Entity Framework 可以设置的 ReadOnly 属性

asp.net - Entity Framework 从具有不同表关系主/外键场景的两个表中选择

entity-framework - 如何使实体数据模型设计器使用我的数据库列描述?

java - 当 FetchType 为 LAZY 时获取嵌套对象

c# - 带有过期时间的 Lazy<T>

c# - "The owned entity type requires to be referenced from another entity type via a navigation"