SQL Server 2019 Express是否支持只读模式?
可以拆分仅用于查询的专用
DbContext,这是 EF Core 生态中非常成熟的读写分离实践,完全适配 SQL Server 2019 Express + EF Core 的技术栈。 拆分的核心收益
- 彻底避免误写入:只读
DbContext可以全局关闭实体跟踪,即便误调用SaveChanges()也不会产生任何数据修改操作,适配纯查询的使用场景 - 降低性能开销:全局无跟踪配置下,查询性能比通用
DbContext高 20%~30%,对资源上限较低的 SQL Server 2019 Express 非常友好 - 简化维护逻辑:可以仅映射查询需要用到的实体/视图,不需要加载写操作相关的拦截器、值生成器、事务配置等冗余逻辑
具体实现方式
1. 定义只读 DbContext 子类
直接继承 EF Core 的 DbContext 类,自定义子类命名可以按业务习惯取,比如 QueryOnlyDbContext、ReadOnlyDbContext 都可以。
2. 配置全局只读属性
在 OnConfiguring 方法中添加全局无跟踪配置,代码示例如下:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder // 复用你现有项目的 SQL Server 2019 Express 连接字符串即可 .UseSqlServer("Your_SQL_Server_2019_Express_Connection_String") // 全局关闭实体跟踪,实现只读默认配置 .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking); }
3. 依赖注入注册(如果用DI容器)
可以和原有写操作的 DbContext 同时注册,二者互不影响:
// 原有用于写操作的通用 DbContext 注册 builder.Services.AddDbContext<AppDbContext>(options => options.UseSqlServer("Your_Connection_String")); // 新增只读查询专用 DbContext 注册 builder.Services.AddDbContext<ReadOnlyDbContext>(options => options.UseSqlServer("Your_Connection_String") .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking));
注意事项
- 实体映射可以直接复用原有通用
DbContext的配置,不需要重复编写,也可以按需仅保留查询需要的实体,减少DbContext初始化开销 - 多个
DbContext会自动复用 EF Core 的连接池,不会额外占用 SQL Server 2019 Express 的连接配额,小项目完全不需要担心资源不足问题 - 如果需要限制更严格,可以重写
SaveChanges()和SaveChangesAsync()方法,直接抛出异常,彻底禁止写入操作:
public override int SaveChanges() { throw new InvalidOperationException("只读DbContext不支持写入操作"); } public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default) { throw new InvalidOperationException("只读DbContext不支持写入操作"); }
内容的提问来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

