EF Core 数据访问三件套:池化 · 仓储 · 不跟踪

EF Core 数据访问三件套:池化 · 仓储 · 不跟踪

今天聊「程序怎么跟数据库打交道」这件事,串起三个核心概念:DbContext、池化工厂、依赖注入。全程用公开技术概念,不涉及任何具体项目/产品。

一、概念:DbContext 是「跟数据库打交道的窗口」

所有查数据、存数据、改数据、删数据的操作,都通过一个叫 DbContext 的对象去办。它就是你和数据库之间的那一个「服务窗口」。

生活类比:你去办事大厅,不管办什么事,都得走到那个窗口前,窗口里的工作人员帮你办。DbContext 就是这个窗口。

二、为什么不每次 new 一个窗口:池化

最简单的做法是「每次要用就 new 一个窗口,用完扔掉」。但造一个窗口是有成本的(要准备一堆内部状态),频繁 new 会浪费。

更好的做法是池化 :造一批窗口放着,谁要用就借一个 ,用完擦干净还回去,下一个人接着用。

生活类比:共享单车。一批车停桩位上,骑完还回桩,下个人接着骑,不用每人买辆新车。

三、工厂与池:管理员和车棚

池化这件事,靠两个角色配合:

  • 工厂(IDbContextFactory) = 管理员。你找它借窗口,它从池里拿一个给你。
  • = 管理员肚子里的「车棚」,存着那些空闲的窗口。

借的方法就叫 CreateDbContext()------你调它,管理员就从车棚里提一辆(或现造一辆)给你。

四、DbContextOptions:一张电话卡

窗口要干活,得先知道「连哪个数据库」。这个信息装在一个叫 DbContextOptions 的「配置包」里,最重要一条是连接串(地址 + 账号密码)。

顺序是:先填好电话卡(配置包)→ 再造窗口(DbContext)。窗口拿到卡才知道拨哪个号码。

五、依赖注入容器:人事部

那工厂(管理员)从哪来?不是我们手动 new 的,是交给一个「登记本」管:

  • 程序启动时,往登记本上写「怎么造管理员」(AddPooledDbContextFactory)。
  • 之后有地方喊「我要个管理员」,**DI 容器(依赖注入容器)**就照登记本造一个派过去。

生活类比:登记本 = 员工登记表;DI 容器 = 人事部;喊「我要管理员」= 某个岗位缺人;派过去的 = 那个管理员。

附录:语法点(示意,泛化)

csharp 复制代码
// 1. 注册池化工厂(登记「怎么造管理员」)
services.AddPooledDbContextFactory<MyDbContext>(options =>
    options.UseMySQL(连接串)
           .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking));

// 2. 造窗口(定义 DbContext,收配置包)
public class MyDbContext : DbContext
{
    public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) { }
}

// 3. 借窗口(管理员 CreateDbContext 从池里借)
await using var ctx = await factory.CreateDbContextAsync();

三个语法点:

  • AddPooledDbContextFactory<T>():登记「用池化方式管 T」。
  • DbContextOptions<T>:配置包类型,构造 DbContext 时传进去。
  • CreateDbContextAsync():从池里借一个 DbContext 实例。
相关推荐
whcyhhh15 分钟前
头歌实践教学平台:大数据存储2023(十三1)
大数据·数据库·python
TDengine (老段)20 分钟前
TDengine 应用案例 — IT 运维与可观测性
大数据·运维·数据库·制造·时序数据库·tdengine·涛思数据
疯狂打码的少年20 分钟前
【数据库技术】关系代数连接运算(等值连接/自然连接/外连接)
jvm·数据库·笔记·oracle
小王C语言26 分钟前
MySQL 视图:视图是什么,视图和基表之间的关系
数据库·mysql
程序员-Benothing28 分钟前
什么是 MySQL 的主从同步机制?它是如何实现的?
android·数据库·mysql
Wang's Blog32 分钟前
Vibe Coding一人即团队系列31:基于Claude Code实现登录注册与数据库联动
数据库·人工智能
2601_9620566035 分钟前
Spring Boot——日志介绍和配置
java·数据库·spring boot
Cloud云卷云舒38 分钟前
【运营商数据库】实战淬炼,规模落地 | 中国移动HaishanDB年中总结会圆满召开
数据库·postgresql·ai-native·haishandb·移动云海山数据库
烂蜻蜓38 分钟前
Flask入门教程(十三):数据库操作——SQLAlchemy与CRUD完整实践
数据库·oracle·flask