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<…>()...;
我正在寻找一种在我的 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<…>()...;