DbContext 就是工作单元,因其内置变更追踪、原子提交、事务一致性等能力;仅当需解耦ORM、共享上下文、统一事务或便于Mock时,才需额外抽象IUnitOfWork接口。
EF Core 本身已经内置了工作单元(Unit of Work)模式的核心行为——DbContext 就是一个天然的工作单元。它自动跟踪实体状态、批量提交变更、保证事务一致性,无需额外封装即可直接使用。所谓“实现工作单元模式”,更多是按需进行合理抽象和组织,而非从零造轮子。
DbContext 在生命周期内:
当你有以下需求时,可考虑封装一层 UoW 接口:
注意:过度抽象可能增加复杂度,小项目通常直接用 DbContext 更清晰。
定义接口:
public interface IUnitOfWork : IDisposable
{
DbContext Context { get; }
Task SaveChangesAsync(CancellationToken cancellationToken = default);
void BeginTransaction();
void Commit();
void Rollback();
}
实现类(复用现有 DbContext):
public class UnitOfWork : IUnitOfWork
{
private readonly DbContext _context;
private IDbContextTransaction _transaction;
public UnitOfWork(DbContext context) => _context = context;
public DbContext Context => _context;
public async Task SaveChangesAsync(CancellationToken cancellationToken = default)
=> await _context.SaveChangesAsync(cancellationToken);
public void BeginTransaction() =>
_transaction ??= _context.Database.BeginTransaction();
public void Commit()
{
_transaction?.Commit();
_transaction?.Dispose();
_transaction = null;
}
public void Rollback()
{
_transaction?.Rollback();
_transaction?.Dispose();
_transaction = null;
}
public void Dispose() => _transaction?.Dispose();
}
注册为 Scoped 服务(Startup.cs 或 Program.cs):
services.AddScoped(); services.AddDbContext(options => options.UseSqlServer(connectionString));
确保多个 Repository 共享同一个 DbContext(即同一个 UoW):
public class OrderService
{
private readonly IUnitOfWork _unitOfWork;
private readonly IOrderRepository _orderRepo;
private readonly IProductRepository _productRepo;
public OrderService(
IUnitOfWork unitOfWork,
IOrderRepository orderRepo,
IProductRepository productRepo)
{
_unitOfWork = unitOfWork;
_orderRepo = orderRepo;
_productRepo = productRepo;
}
public async Task PlaceOrderAsync(Order order)
{
_unitOfWork.BeginTransaction();
try
{
await _orderRepo.AddAsync(order);
var product = await _productRepo.GetByIdAsync(order.ProductId);
product.Stock -= order.Quantity;
await _unitOfWork.SaveChangesAsync();
_unitOfWork.Commit();
}
catch
{
_unitOfWork.Rollback();
throw;
}
}
}
关键点:所有仓储构造函数应接收 DbContext 或 IUnitOfWork,而不是自行 new DbContext。
基本上就这些。EF Core 的工作单元不复杂但容易忽略其本质——它不是必须封装的“设计模式”,而是你每天都在用的 DbContext 的自然能力。
# ai
# sqlserver
# 为什么
# 封装
# 构造函数
# 接口
# 数据库
# 多个
# 时方
# 都在
# 你有
# 而非
# 因其
# 按需
# 时需
# 复用
# 更清晰
相关文章:
如何在阿里云虚拟服务器快速搭建网站?
建站之星2.7模板快速切换与批量管理功能操作指南
广州营销型建站服务商推荐:技术优势与SEO优化解析
深圳企业网站制作设计,在深圳如何网上全流程注册公司?
东莞专业制作网站的公司,东莞大学生网的网址是什么?
历史网站制作软件,华为如何找回被删除的网站?
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
高端网站建设与定制开发一站式解决方案 中企动力
建站主机核心功能解析:服务器选择与网站搭建流程指南
如何通过FTP空间快速搭建安全高效网站?
如何在建站宝盒中设置产品搜索功能?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
建站之星如何修改网站生成路径?
c# 在ASP.NET Core中管理和取消后台任务
网站制作新手教程,新手建设一个网站需要注意些什么?
重庆市网站制作公司,重庆招聘网站哪个好?
高端建站三要素:定制模板、企业官网与响应式设计优化
建站之星如何保障用户数据免受黑客入侵?
如何规划企业建站流程的关键步骤?
如何配置WinSCP新建站点的密钥验证步骤?
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
教程网站设计制作软件,怎么创建自己的一个网站?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
建站之星后台密码遗忘?如何快速找回?
宝塔新建站点报错如何解决?
如何通过多用户协作模板快速搭建高效企业网站?
建站168自助建站系统:快速模板定制与SEO优化指南
动图在线制作网站有哪些,滑动动图图集怎么做?
建站之星安装提示数据库无法连接如何解决?
为什么Go需要go mod文件_Go go mod文件作用说明
,想在网上投简历,哪几个网站比较好?
如何在万网自助建站中设置域名及备案?
,网页ppt怎么弄成自己的ppt?
javascript基本数据类型及类型检测常用方法小结
如何用IIS7快速搭建并优化网站站点?
宝塔面板如何快速创建新站点?
网站制作公司排行榜,四大门户网站排名?
制作旅游网站html,怎样注册旅游网站?
如何制作算命网站,怎么注册算命网站?
如何通过虚拟主机空间快速建站?
高防服务器:AI智能防御DDoS攻击与数据安全保障
如何撰写建站申请书?关键要点有哪些?
广德云建站网站建设方案与建站流程优化指南
如何快速完成中国万网建站详细流程?
设计网站制作公司有哪些,制作网页教程?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
如何解决VPS建站LNMP环境配置常见问题?
已有域名和空间,如何快速搭建网站?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
*请认真填写需求信息,我们会在24小时内与您取得联系。