EF Core 有条件地启用延迟加载

EF Core enable Lazy Loading conditionally

我正在寻找一种在我的 DbContext 中启用延迟加载的可能方法,但不是一直如此,仅在我需要的特定情况下。由于像大型数据集的 N+1 查询和 JSON 序列化遍历对象属性和序列化我的整个数据库这样的问题,我通常不希望延迟加载。但是,在某些情况下我确实想要它。生成报告时,我加载了一个顶级对象和许多子对象以填充报告字段。由于模式的性质,这将需要 30 次或更多次 Include()ThenInclude() 调用,而无需延迟加载。

有没有办法在查询时有条件地启用延迟加载?我尝试使用 2 DbContexts,其中一个扩展另一个并启用延迟加载,如下所示:

public class MyLazyContext : MyContext
{
    public MyLazyContext(DbContextOptions<MyLazyContext> options) : base(options) { }

    protected override OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseLazyLoadingProxies();
    }
}

并将它们作为依赖项单独注入。构造函数在将 DbContextOptions<MyLazyContext> 传递给需要 DbContextOptions<MyContext> 的基本构造函数时遇到问题,因此我将它们都更改为 DbContextOptions<MyContext>。虽然这在我的网络应用程序中有效,但由于我的通用 class 激活器如何为 DbContext 工作,我的单元测试被破坏了——这让我认为这种方法是代码味道,所以我开始寻找更好的解决方案.

您可以使用 ChangeTracker.LazyLoadingEnabled 属性:

Gets or sets a value indicating whether navigation properties for tracked entities will be loaded on first access.

The default value is true.

例如

context.ChangeTracker.LazyLoadingEnabled = false;
var query = context.Set<…>()...;