猿问

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

我正在寻找一种可能的方法来启用延迟加载,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- 这让我认为这种方法是代码异味,所以我开始寻找更好的解决方案。


哆啦的时光机
浏览 317回答 1
1回答

慕容3067478

您可以使用ChangeTracker.LazyLoadingEnabled属性:获取或设置一个值,该值指示是否将在首次访问时加载被跟踪实体的导航属性。默认值是true。例如context.ChangeTracker.LazyLoadingEnabled&nbsp;=&nbsp;false; var&nbsp;query&nbsp;=&nbsp;context.Set<…>()...;
随时随地看视频慕课网APP
我要回答