全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

EF Core如何实现工作单元模式 EF Core工作单元(Unit of Work)教程

DbContext 就是工作单元,因其内置变更追踪、原子提交、事务一致性等能力;仅当需解耦ORM、共享上下文、统一事务或便于Mock时,才需额外抽象IUnitOfWork接口。

EF Core 本身已经内置了工作单元(Unit of Work)模式的核心行为——DbContext 就是一个天然的工作单元。它自动跟踪实体状态、批量提交变更、保证事务一致性,无需额外封装即可直接使用。所谓“实现工作单元模式”,更多是按需进行合理抽象和组织,而非从零造轮子。

为什么 DbContext 就是工作单元?

DbContext 在生命周期内:

  • 维护一份变更追踪(Change Tracker),记录所有 Add/Update/Remove 操作
  • 调用 SaveChanges() 或 SaveChangesAsync() 时,将所有待处理的变更一次性提交到数据库(原子性)
  • 默认在单个事务中执行(除非显式禁用或嵌套事务)
  • 支持手动开启事务(BeginTransaction)、回滚(Rollback)和提交(Commit)

何时需要进一步抽象 UoW?

当你有以下需求时,可考虑封装一层 UoW 接口:

  • 需要解耦业务逻辑与 EF Core 实现(例如未来可能切换 ORM)
  • 多个仓储(Repository)需共享同一上下文,确保跨仓储操作的一致性
  • 统一管理事务边界(尤其在 CQRS 或领域服务中)
  • 集成测试时方便 Mock 工作单元行为

注意:过度抽象可能增加复杂度,小项目通常直接用 DbContext 更清晰。

一个轻量实用的 UoW 实现

定义接口:

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 使用的典型场景

确保多个 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小时内与您取得联系。