当前位置: 首页 > news >正文

.NET SqlSugar 仓储、工作单元、服务层

1. 安装 NuGet

 
SqlSugarCore
 

 

2. SqlSugar 数据库上下文

 
using SqlSugar;namespace Demo;public class SqlSugarContext
{public ISqlSugarClient Db { get; }public SqlSugarContext(){Db = new SqlSugarClient(new ConnectionConfig{ConnectionString = "Data Source=.;Database=DemoDb;UID=sa;PWD=123;",DbType = DbType.SqlServer,IsAutoCloseConnection = true});}
}
 

 

3. 实体

 
public class Product
{public int Id { get; set; }public string Name { get; set; }public int Stock { get; set; }
}public class Order
{public int Id { get; set; }public int ProductId { get; set; }public decimal Price { get; set; }
}public class OrderDto
{public int OrderId { get; set; }public string ProductName { get; set; }public int Stock { get; set; }public decimal Price { get; set; }
}
 

 

4. 仓储

 

接口

 
public interface IRepository<T> where T : class, new()
{// 查询Task<T> GetByIdAsync(int id);Task<List<T>> GetListAsync();// ==========================================// 1. 事务模式:AddQueue → 入队,不执行SQL// ==========================================void Insert(T entity);void Update(T entity);void Delete(T entity);// ==========================================// 2. 立即模式:ExecuteCommand → 直接执行SQL// ==========================================Task InsertImmediateAsync(T entity);Task UpdateImmediateAsync(T entity);Task DeleteImmediateAsync(T entity);
}
 

实现

 
using SqlSugar;namespace Demo;public class Repository<T> : IRepository<T> where T : class, new()
{private readonly ISqlSugarClient _db;public Repository(ISqlSugarClient db){_db = db;}// ======================// 查询(直接执行)// ======================public async Task<T> GetByIdAsync(int id)=> await _db.Queryable<T>().InSingleAsync(id);public async Task<List<T>> GetListAsync()=> await _db.Queryable<T>().ToListAsync();// ======================// 事务模式:AddQueue// 只入队,不执行SQL// 必须等 SaveQueuesAsync 才执行// ======================public void Insert(T entity)=> _db.Insertable(entity).AddQueue();public void Update(T entity)=> _db.Updateable(entity).AddQueue();public void Delete(T entity)=> _db.Deleteable(entity).AddQueue();// ======================// 立即模式:ExecuteCommand// 直接执行SQL,不走队列// 不需要 SaveChanges,无事务// ======================public async Task InsertImmediateAsync(T entity)=> await _db.Insertable(entity).ExecuteCommandAsync();public async Task UpdateImmediateAsync(T entity)=> await _db.Updateable(entity).ExecuteCommandAsync();public async Task DeleteImmediateAsync(T entity)=> await _db.Deleteable(entity).ExecuteCommandAsync();
}
 

 

5. 工作单元 UnitOfWork

 
管理所有仓储 + 统一提交队列事务
 
namespace Demo;public interface IUnitOfWork
{IRepository<Product> Products { get; }IRepository<Order>    Orders { get; }Task SaveChangesAsync();
}public class UnitOfWork : IUnitOfWork
{private readonly ISqlSugarClient _db;public UnitOfWork(SqlSugarContext context){_db = context.Db;}// 懒加载仓储private IRepository<Product>? _productRepo;public IRepository<Product> Products=> _productRepo ??= new Repository<Product>(_db);private IRepository<Order>? _orderRepo;public IRepository<Order> Orders=> _orderRepo ??= new Repository<Order>(_db);// ======================// 提交所有 AddQueue 操作// 自动开启一个事务// 全部成功/全部回滚// ======================public async Task SaveChangesAsync(){await _db.SaveQueuesAsync();}
}
 

 

6. 服务层

 

规则

 
1)单表 / 多表增删改
 
→ 走 Repository + UnitOfWork
 
→ 用 AddQueue
 
→ SaveChangesAsync 统一事务,原子性
 
2)多表联查 / 复杂查询 / 分页
 
→ 直接用 ISqlSugarClient
 
→ 不进仓储,不进 Uow
 
using SqlSugar;namespace Demo;public class OrderService
{private readonly IUnitOfWork      _uow;  // 增删改 + 事务private readonly ISqlSugarClient  _db;   // 查询/联表public OrderService(IUnitOfWork uow, SqlSugarContext context){_uow = uow;_db  = context.Db;}// ==================================================// 1)增删改(单表/多表)→ 走 Uow + 事务 + 原子性// ==================================================public async Task CreateOrder(Order order){// 1. 订单入队_uow.Orders.Insert(order);// 2. 扣库存入队var product = await _uow.Products.GetByIdAsync(order.ProductId);product.Stock--;_uow.Products.Update(product);// 3. 统一提交:开启一个事务,执行所有队列await _uow.SaveChangesAsync();}// ==================================================// 单表立即执行:不使用事务,直接插入// ==================================================public async Task AddProductImmediate(Product product){// 直接执行SQL,无事务,不需要 SaveChangesawait _uow.Products.InsertImmediateAsync(product);}// ==================================================// 2)多表联查 / 复杂查询 / 分页// 直接用 _db,不走仓储,不走 Uow// ==================================================public async Task<List<OrderDto>> GetOrderList(){return await _db.Queryable<Order>().LeftJoin<Product>((o, p) => o.ProductId == p.Id).Select((o, p) => new OrderDto{OrderId     = o.Id,ProductName = p.Name,Stock       = p.Stock,Price       = o.Price}).ToListAsync();}public async Task<List<OrderDto>> GetPageList(int pageIndex, int pageSize){return await _db.Queryable<Order>().LeftJoin<Product>((o, p) => o.ProductId == p.Id).Select((o, p) => new OrderDto{OrderId     = o.Id,ProductName = p.Name}).ToPageListAsync(pageIndex, pageSize);}
}
 
 

 

7. Program.cs 注册

 
var builder = WebApplication.CreateBuilder(args);builder.Services.AddSingleton<SqlSugarContext>();
builder.Services.AddScoped<IUnitOfWork, UnitOfWork>();
builder.Services.AddScoped<OrderService>();var app = builder.Build();
app.Run();
 

 

8. 知识点总结

 

AddQueue() 是什么?

 
_db.Insertable(entity).AddQueueAsync()
 
  • 不执行 SQL
  • 把操作加入事务队列
  • 必须调用 SaveQueuesAsync() 才会真正执行
  • 多个操作共用一个事务,保证原子性
 

ExecuteCommandAsync() 是什么?

 
_db.Insertable(entity).ExecuteCommandAsync()
 
  • 立即执行 SQL
  • 不入队
  • 不需要 SaveChanges
  • 无事务,执行完就落库
 

③ 三层用法规则

 

1)单表 / 多表增删改

 
→ 走 Repository + UnitOfWork
 
→ 使用 Add/Update/Delete(AddQueue)
 
→ 最后 SaveChangesAsync
 
→ 一个事务,原子性,要么全成功要么全失败
 

2)多表联查 / 复杂查询 / 报表 / 分页

 
→ 直接使用 ISqlSugarClient
 
→ 不进仓储,不进 UnitOfWork
 
→ 自由 Join / Where / OrderBy / Select / ToPageList
 

3)Service 结构

 
Service
├─ 写操作(增删改)
│   → _uow.仓储.Add/Update/Delete
│   → _uow.SaveChangesAsync()
└─ 读操作(查询/联表/分页)→ _db.Queryable<T>().Join<T2>().Select(...)
 

 

9. 总结

 
  • AddQueue:先排队,最后统一事务执行
  • ExecuteCommand:立即执行,不排队,无事务
  • 增删改走 Uow,查询直接用 SqlSugar
  • 仓储只管单表,Uow 管事务,Service 管业务
http://www.jsqmd.com/news/707803/

相关文章:

  • MCP 2026多租户隔离配置失效的5种静默形态,如何用1条kubectl命令+3行Prometheus告警规则实时捕获?
  • 想给照片换背景?这几款工具 + 1个微信小程序的搭配建议
  • 你的公司Wi-Fi总被蹭?可能是缺了这台“看门人”:手把手搭建AD域控实现802.1x认证
  • WPS 通配符神技:一键上标参考文献 + 中英文自动加空格
  • 2026年如何高效降低AI率?6款最新低成本降AI率工具实测(附独家指令) - 降AI实验室
  • 佛山定制楼梯品牌选型指南:技术维度拆解与实测参考 - 资讯焦点
  • 告别依赖冲突!手把手教你从源码编译libfranka 0.10.0与franka_ros(附特定版本切换指南)
  • KoGPT大模型推理加速:FasterTransformer优化实践
  • 换季总感冒发烧怎么回事?乳贝初接骨木莓配方,筑免疫防线 - 资讯焦点
  • TileKernels从入门到精通
  • 成都青少儿英语培训怎么选才契合孩子需求? - 品牌推荐官方
  • Oracle数据库物化视图概述
  • 中山定制楼梯品牌怎么选?从技术维度拆解核心标准 - 资讯焦点
  • 选择旅游团商家时应从哪些方面考量、如何挑选? - 品牌推荐官方
  • 别再手动调PID了!用STM32 MotorControl Workbench 5.4.4快速搞定FOC电机调试
  • GHelper:轻量级华硕笔记本控制工具完整使用指南
  • CST优化器避坑指南:为什么你的参数优化总不收敛?可能是这5个设置没搞对
  • 白酒品牌究竟该找谁来做?原来背后有这些门道! - 品牌推荐官方
  • GEO 实战教程:从 0 到 1 构建企业 GEO 体系
  • 给新生儿选纸尿裤别踩坑,2026年10大主流品牌盘点 - 资讯焦点
  • 桌面/在线/小程序三种抠图路线,2026 年选哪种更方便
  • STM32---项目学习日记
  • 2026年高效降AI工具必备收藏清单 - 降AI实验室
  • 茶韵悦龄——基于AI与适老化设计的益智康养平台
  • AI Agent开发指南:从Awesome清单到实战应用
  • 证件翻译公司选型全攻略:资质、流程与服务核心标准 - 资讯焦点
  • 2026年3月回填土压密注浆公司口碑推荐,基础灌浆加固/堤坝帷幕注浆/回填土压密注浆/地基注浆,回填土压密注浆企业找哪家 - 品牌推荐师
  • 如何快速掌握Chromium/V8通用修改器:终极Chromatic使用指南
  • XUnity.AutoTranslator终极教程:3步让任何Unity游戏秒变中文版
  • 不止torch.exp():一文搞懂PyTorch中指数对数全家桶(expm1/log/log2/log10)的实战用法