启用DbContext池后,如何替代OnConfiguring设置UseQueryTrackingBehavior?
解决方案
当启用DbContext池化后,确实无法通过重写OnConfiguring方法修改DbContextOptions,这里提供两种可行的全局设置QueryTrackingBehavior.NoTracking的方式:
1. 服务注册时直接配置选项
如果AddOracleDatabaseDbContext方法支持传入配置委托(大部分EF Core扩展都提供此重载),可以在注册时直接添加查询跟踪配置:
builder.AddOracleDatabaseDbContext<MyContext>("ReadOnlyConnection", options => { options.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking); });
这种方式是最推荐的,因为配置是在DbContext池初始化前完成的,完全符合池化的要求。
2. 在DbContext构造函数中设置ChangeTracker
如果注册时无法直接配置选项,可以在DbContext的构造函数中通过ChangeTracker全局设置查询跟踪行为:
public class MyContext : DbContext { public MyContext(DbContextOptions<MyContext> options) : base(options) { ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; } // 你的DbSet定义等代码 }
DbContext池化机制会在每次取出实例时重置状态,但QueryTrackingBehavior属于全局配置,不会被重置,因此可以稳定生效。
另外,如果只是部分查询需要无跟踪,也可以在单个查询后追加AsNoTracking()或AsNoTrackingWithIdentityResolution(),但这不属于全局设置。
内容的提问来源于stack exchange,提问作者Liam
相关产品推荐
相关产品推荐

