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

时间:2018-08-14 19:05:53

标签: c# asp.net-core entity-framework-core lazy-loading

我正在寻找一种可能的方式来在我的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>。尽管此方法在我的Web应用程序中有效,但是由于我的通用类激活器如何为DbContext工作而导致单元测试失败-这使我认为该方法具有代码味道,因此我开始寻找更好的解决方案。

1 个答案:

答案 0 :(得分:4)

您可以使用ChangeTracker.LazyLoadingEnabled属性:

  

获取或设置一个值,该值指示是否在首次访问时加载被跟踪实体的导航属性。

     

默认值为true。

例如

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