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)多表联查 / 复杂查询 / 报表 / 分页
→ 直接使用
→ 不进仓储,不进 UnitOfWork
→ 自由
ISqlSugarClient
Join / Where / OrderBy / Select / ToPageList3)Service 结构
Service
├─ 写操作(增删改)
│ → _uow.仓储.Add/Update/Delete
│ → _uow.SaveChangesAsync()
└─ 读操作(查询/联表/分页)→ _db.Queryable<T>().Join<T2>().Select(...)
9. 总结
- AddQueue:先排队,最后统一事务执行
- ExecuteCommand:立即执行,不排队,无事务
- 增删改走 Uow,查询直接用 SqlSugar
- 仓储只管单表,Uow 管事务,Service 管业务
