ABP - SqlSugar [SqlSugarModule、ISqlSugarClient、SqlSugarRepository]
SqlSugar ORM 集成
核心辅助类:
SqlSugarModule:SqlSugar集成模块(需手动引入社区包)。ISqlSugarClient:SqlSugar核心客户端。SqlSugarRepository<T>:基于SqlSugar的仓储实现。
你关注到了ABP与SqlSugar ORM的集成细节,这个组合能兼顾ABP的模块化架构和SqlSugar的高效查询能力,非常实用。下面通过具体示例和讲解,带你理解这三个核心组件的用法:
1. SqlSugarModule:SqlSugar的集成入口(模块配置)
SqlSugarModule是ABP框架中集成SqlSugar的核心模块,负责初始化SqlSugar客户端、注册相关服务。使用前需先引入社区包(如Abp.SqlSugar或SqlSugarCore),再在自定义模块中配置依赖和连接信息。
示例:配置SqlSugarModule
// 1. 先引入必要包(NuGet安装)
// - SqlSugarCore(SqlSugar核心包)
// - Abp.SqlSugar(ABP与SqlSugar的集成包,社区维护)
using Volo.Abp.Modularity;
using SqlSugar;
[DependsOn(
typeof(AbpSqlSugarModule) // 依赖SqlSugar集成模块
)]
public class MyAppModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
// 2. 配置SqlSugar客户端
context.Services.AddSqlSugarClient(config =>
{
// 配置数据库连接字符串
config.ConnectionString = "Server=.;Database=MyAppDb;Uid=sa;Pwd=123456;";
// 配置数据库类型(SqlServer/MySql/PostgreSQL等)
config.DbType = DbType.SqlServer;
// 可选:配置全局查询过滤(如多租户隔离、软删除)
config.GlobalFilter.Add("SoftDelete", it => it.GetType().GetProperty("IsDeleted") != null, it => (bool)it.GetValue("IsDeleted") == false);
// 可选:开启日志(便于调试SQL)
config.Aop.OnLogExecuting = (sql, pars) =>
{
Console.WriteLine($"SQL: {sql}");
};
});
}
}
讲解:
- 依赖声明:必须在自定义模块上添加
[DependsOn(typeof(AbpSqlSugarModule))],确保SqlSugar的基础服务被注册。 - 核心配置:通过
AddSqlSugarClient配置数据库连接、数据库类型,这是SqlSugar工作的基础。 - 高级配置:可通过
GlobalFilter添加全局过滤(如软删除逻辑)、通过Aop配置SQL日志或事务拦截,减少重复代码。
2. ISqlSugarClient:SqlSugar的核心操作客户端
ISqlSugarClient是SqlSugar的核心接口,封装了所有数据库操作(查询、插入、更新、删除、事务等),通过ABP的依赖注入可直接在服务中使用,无需手动创建实例。
示例:使用ISqlSugarClient操作数据库
using Volo.Abp.DependencyInjection;
using SqlSugar;
using System.Linq.Expressions;
public class BookService : ITransientDependency
{
private readonly ISqlSugarClient _db;
// 构造函数注入ISqlSugarClient(由SqlSugarModule自动注册)
public BookService(ISqlSugarClient db)
{
_db = db;
}
// 1. 查询(单条数据)
public async Task<Book> GetBookByIdAsync(Guid id)
{
// 链式查询:Where条件 -> 取单条
return await _db.Queryable<Book>()
.Where(book => book.Id == id)
.FirstAsync();
}
// 2. 分页查询
public async Task<PageResult<BookDto>> GetBooksByPageAsync(int pageIndex, int pageSize)
{
// 分页查询:Skip(跳过条数)-> Take(取条数)-> 总计数
var totalCount = await _db.Queryable<Book>().CountAsync();
var books = await _db.Queryable<Book>()
.OrderBy(book => book.CreationTime, OrderByType.Desc)
.Skip((pageIndex - 1) * pageSize)
.Take(pageSize)
.ToListAsync();
// 转换为DTO并返回分页结果
return new PageResult<BookDto>
{
TotalCount = totalCount,
Items = ObjectMapper.Map<List<Book>, List<BookDto>>(books)
};
}
// 3. 事务操作(插入+更新)
public async Task CreateBookWithAuthorAsync(Book book, Author author)
{
// 开启事务
using (var tran = _db.Ado.BeginTran())
{
try
{
// 插入作者
await _db.Insertable(author).ExecuteReturnSnowflakeIdAsync();
// 关联作者ID并插入书籍
book.AuthorId = author.Id;
await _db.Insertable(book).ExecuteAsync();
// 提交事务
tran.Commit();
}
catch (Exception)
{
// 回滚事务
tran.Rollback();
throw;
}
}
}
}
讲解:
- 核心能力:
ISqlSugarClient提供链式查询(Queryable)、插入(Insertable)、更新(Updateable)、删除(Deleteable)等API,语法简洁且支持Lambda表达式。 - 事务支持:通过
_db.Ado.BeginTran()开启事务,配合Commit()/Rollback()实现事务一致性,也可结合ABP的[UnitOfWork]特性自动管理事务。 - 灵活性:支持原生SQL(
_db.Ado.SqlQuery)、存储过程调用,适合复杂查询场景,同时保留ORM的类型安全特性。
3. SqlSugarRepository<T>:基于SqlSugar的仓储实现
SqlSugarRepository<T>是ABP风格的仓储类,封装了ISqlSugarClient的基础CRUD操作,提供更符合ABP开发习惯的仓储接口(如GetAsync、InsertAsync),同时支持扩展自定义查询。
示例:自定义仓储继承SqlSugarRepository<T>
using Volo.Abp.Domain.Repositories;
using SqlSugar;
// 1. 定义实体(Book)
public class Book : Entity<Guid>
{
public string Name { get; set; }
public decimal Price { get; set; }
public Guid? AuthorId { get; set; }
public DateTime CreationTime { get; set; } = DateTime.Now;
}
// 2. 定义仓储接口(继承IRepository,符合ABP规范)
public interface IBookRepository : IRepository<Book, Guid>
{
// 扩展自定义方法:查询作者的所有书籍
Task<List<Book>> GetBooksByAuthorIdAsync(Guid authorId);
}
// 3. 实现仓储(继承SqlSugarRepository,复用基础CRUD)
public class BookRepository : SqlSugarRepository<Book, Guid>, IBookRepository
{
// 构造函数注入ISqlSugarClient(父类已封装,可直接使用)
public BookRepository(ISqlSugarClient sqlSugarClient) : base(sqlSugarClient)
{
}
// 实现自定义查询方法
public async Task<List<Book>> GetBooksByAuthorIdAsync(Guid authorId)
{
// 可直接使用父类的DbClient(即ISqlSugarClient)进行查询
return await DbClient.Queryable<Book>()
.Where(book => book.AuthorId == authorId)
.OrderBy(book => book.CreationTime)
.ToListAsync();
}
}
// 4. 在服务中使用自定义仓储
public class BookAppService : ApplicationService
{
private readonly IBookRepository _bookRepository;
public BookAppService(IBookRepository bookRepository)
{
_bookRepository = bookRepository;
}
public async Task<List<BookDto>> GetByAuthorAsync(Guid authorId)
{
// 调用仓储的自定义方法
var books = await _bookRepository.GetBooksByAuthorIdAsync(authorId);
return ObjectMapper.Map<List<Book>, List<BookDto>>(books);
}
public async Task DeleteAsync(Guid id)
{
// 调用父类封装的基础方法(DeleteAsync)
await _bookRepository.DeleteAsync(id);
}
}
讲解:
- ABP规范兼容:
SqlSugarRepository<T>实现了ABP的IRepository接口,可无缝替换ABP默认的EF Core仓储,无需修改服务层代码。 - 基础CRUD复用:父类已封装
GetAsync、InsertAsync、UpdateAsync、DeleteAsync等基础方法,无需重复编写。 - 自定义扩展:通过继承
SqlSugarRepository<T>,可在子类中扩展复杂查询(如多表关联、聚合查询),同时保留SqlSugar的高效语法。
核心总结与优势
- 模块化集成:
SqlSugarModule让SqlSugar融入ABP的模块生命周期,配置集中且可复用。 - 高效操作:
ISqlSugarClient提供比EF Core更简洁的查询语法,性能更优(尤其复杂查询场景)。 - 仓储适配:
SqlSugarRepository<T>桥接SqlSugar与ABP的仓储模式,兼顾ORM灵活性和架构规范性。
要不要我帮你整理一份ABP+SqlSugar的基础项目模板代码?包含模块配置、仓储实现、服务调用的完整流程,你可以直接复用。

浙公网安备 33010602011771号