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的基础项目模板代码?包含模块配置、仓储实现、服务调用的完整流程,你可以直接复用。