EF Core 和 Minimal API 配合使用很自然,关键在于把 DbContext 正确注册进依赖注入容器,并在端点中直接接收它——不需要控制器、不需要 Repository 层,也能完成数据操作。
注册 DbContext(支持池化)
在 Program.cs 中,用
AddDbContextPool替代
AddDbContext,提升并发性能: 默认池大小是 1024,适合大多数中小型 API 场景 连接字符串从配置读取,比如
builder.Configuration.GetConnectionString("Default")
SQLite 或 SQL Server 都可,只需换掉 UseSqlite或
UseSqlServer
示例代码:
builder.Services.AddDbContextPool<AppDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("Default")));
在端点中直接使用 DbContext
Minimal API 支持自动模型绑定 + 依赖注入,DbContext 可作为参数直接出现在
MapGet、
MapPost等委托中: 无需手动 new,框架自动提供生命周期管理的实例 每个请求获得独立上下文,事务边界清晰 配合
async/await写法更安全,比如
ToListAsync()
例如获取用户列表:
app.MapGet("/users", async (AppDbContext db) =>
await db.Users.ToListAsync());
处理增删改与错误响应
写操作建议显式调用
SaveChangesAsync,并配合
Results返回标准 HTTP 状态码: 新增成功返回
Results.Created($"/users/{user.Id}", user)
找不到资源时返回 Results.NotFound()数据库异常建议捕获
DbUpdateException,避免暴露敏感信息
示例 POST 创建用户:
app.MapPost("/users", async (AppDbContext db, User user) =>
{
db.Users.Add(user);
await db.SaveChangesAsync();
return Results.Created($"/users/{user.Id}", user);
});
搭配迁移与初始化(开发阶段)
Minimal API 项目没有 Global.asax 或 Startup 类,所以数据库初始化逻辑要放在 Program.cs 后置执行:
开发时可用db.Database.Migrate()自动应用未执行的迁移 注意只在
IsDevelopment()环境下执行,避免线上误操作 若用 SQLite,可搭配
EnsureCreated()快速启动,但不支持迁移回滚
示例:
if (app.Environment.IsDevelopment())
{
using var scope = app.Services.CreateScope();
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
db.Database.Migrate(); // 应用所有待执行迁移
}
基本上就这些。不复杂但容易忽略细节,比如池化配置、异步写法、环境判断初始化——补上这几点,Minimal API + EF Core 就能稳稳跑起来。
