ABP - SqlSugar [SqlSugarModule、ISqlSugarClient、SqlSugarRepository]

news/2025/10/24 20:47:42/文章来源:https://www.cnblogs.com/tangge/p/19164199

SqlSugar ORM 集成

核心辅助类

  • SqlSugarModule:SqlSugar集成模块(需手动引入社区包)。
  • ISqlSugarClient:SqlSugar核心客户端。
  • SqlSugarRepository<T>:基于SqlSugar的仓储实现。

你关注到了ABP与SqlSugar ORM的集成细节,这个组合能兼顾ABP的模块化架构和SqlSugar的高效查询能力,非常实用。下面通过具体示例和讲解,带你理解这三个核心组件的用法:

1. SqlSugarModule:SqlSugar的集成入口(模块配置)

SqlSugarModule是ABP框架中集成SqlSugar的核心模块,负责初始化SqlSugar客户端、注册相关服务。使用前需先引入社区包(如Abp.SqlSugarSqlSugarCore),再在自定义模块中配置依赖和连接信息。

示例:配置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开发习惯的仓储接口(如GetAsyncInsertAsync),同时支持扩展自定义查询。

示例:自定义仓储继承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复用:父类已封装GetAsyncInsertAsyncUpdateAsyncDeleteAsync等基础方法,无需重复编写。
  • 自定义扩展:通过继承SqlSugarRepository<T>,可在子类中扩展复杂查询(如多表关联、聚合查询),同时保留SqlSugar的高效语法。

核心总结与优势

  1. 模块化集成SqlSugarModule让SqlSugar融入ABP的模块生命周期,配置集中且可复用。
  2. 高效操作ISqlSugarClient提供比EF Core更简洁的查询语法,性能更优(尤其复杂查询场景)。
  3. 仓储适配SqlSugarRepository<T>桥接SqlSugar与ABP的仓储模式,兼顾ORM灵活性和架构规范性。

要不要我帮你整理一份ABP+SqlSugar的基础项目模板代码?包含模块配置、仓储实现、服务调用的完整流程,你可以直接复用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/945654.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Odoo18.0 对接 京东快递

京东快递 本章我们来看一下如何使用我们欧姆网络科技的京东快递插件来完成Odoo与京东快递的对接。 前期准备 首先我们要先在京东快递的开放平台注册一个商家[自研商家],并完成认证签约。入驻之后我们需要拿到如下参数…

Matplotlib常见画图工具

View PostMatplotlib常见画图工具一、Matplotlib核心基础 在开始绘图前,需掌握以下基础框架,几乎所有图表都基于此扩展:点击查看代码 # 1. 导入库 import matplotlib.pyplot as plt import numpy as np # 用于生成…

[python] 代码性能分析工具line_profiler使用指北

代码分析能够评估各部分代码的时间消耗,即进行时间复杂度分析。通过这一过程,我们可以识别影响整体运行效率的关键部分,从而更高效地利用底层计算资源。此外,代码分析也可用于评估内存使用情况,即空间复杂度,以优…

react的diff算法

这个算法用来比较虚拟dom和真实dom,从而最小化真实dom的更新 本质上是对两颗Fiber树的对比 (在Vue中是对旧VDOM树与新VDOM树的对比) 在不剪枝的情况下,时间复杂度接近O(n^3)基于最长公共子序列 (LCS) 的朴素计算为…

LLM学习记录DAY11

📘今日学习总结 tokenization分词算法 BPE分词(Byte-Pair Encoding)BPE 算法从一组基本符号(例如字母和边界字符)开始,迭代地寻找语料库中的两个相邻词元,并将它们替换为新的词元,这一过程被称为合并。 合并的…

ABP - 当前用户 [ICurrentUser、CurrentUser]

当前用户(Current User) 核心辅助类:ICurrentUser:获取当前登录用户信息(ID、用户名、角色等)。 CurrentUser:静态快捷访问(需在请求上下文内)。在ABP框架中,ICurrentUser和CurrentUser用于获取当前登录用户…

轮次检测模型 VoTurn-80M 开源,多模态融合架构;OpenAI 收购桌面助手 Sky:实时识别屏幕自然语言交互丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的技术」、「有亮点的产品」、「有思考的文章」、「有态度…

ABP - 依赖注入和属性注入

一、依赖注入(Dependency Injection) 核心辅助类:IServiceCollection:扩展方法(如AddTransient、AddScoped)。 DependencyAttribute:标记注入生命周期(Transient/Scoped/Singleton)。 IIocResolver:手动解析…

ABP vNext 框架功能模块 - 依赖注入和属性注入

一、依赖注入(Dependency Injection) 核心辅助类:IServiceCollection:扩展方法(如AddTransient、AddScoped)。 DependencyAttribute:标记注入生命周期(Transient/Scoped/Singleton)。 IIocResolver:手动解析…

SAP维护汇率的关键Tcode

Tcode: OB08 维护汇率Tcode:OBBS 维护汇率的折算比率☆ No matter how much you change, you still have to pay the price for the things youve done.

幂函数

观察幂函数图像结论: 所有的幂函数都过1,1点,幂函数在第一象限必有图像。 a为负数时,不过0,0点,其余都有0,0点。 一、画函数用结论,a<0,单调递减,a>0,单调递增。 二、0<a<1之间,增的缓,a>1,…

ABP vNext 框架功能模块 - 动态API(Dynamic API)[RemoteServiceAttribute | DynamicApiControllerBuilder]

动态API(Dynamic API) 核心辅助类:DynamicApiControllerBuilder:动态生成API控制器。 RemoteServiceAttribute:标记类/方法为远程服务(自动暴露API)。在ABP框架中,DynamicApiControllerBuilder和RemoteService…

第4天(中等题 滑动窗口、哈希表)

打卡第四天 两道中等题哈希表记录元素频率:哈希表程序表示:滑动窗口+哈希表优化算法耗时≈一小时 明天继续 小tips:不小心删除可以用 Ctrl+Z 撤回刚刚消除的代码/文字

ABP vNext 框架功能模块 - 动态API(Dynamic API)

** 动态API(Dynamic API)** 核心辅助类:DynamicApiControllerBuilder:动态生成API控制器。 RemoteServiceAttribute:标记类/方法为远程服务(自动暴露API)。在ABP框架中,DynamicApiControllerBuilder和RemoteSe…

ABP vNext 框架功能模块 - 模块化(Modularity)

模块化(Modularity) 核心辅助类:AbpModule:所有模块的基类,定义模块生命周期方法。 DependsOnAttribute:声明模块依赖关系。 ModuleInitializer:模块初始化器(自动生成)。 IModuleContainer:模块容器,用于运…

ABP vNext 框架功能模块

以下是ABP框架中各核心功能的辅助类及示例说明,涵盖模块化、依赖注入、ORM集成等关键特性: 一. 模块化(Modularity) 核心辅助类:AbpModule:所有模块的基类,定义模块生命周期方法。 DependsOnAttribute:声明模块…

题解:P14299 [JOI2023 预选赛 R2] 填充 / Painting

\(\displaystyle \large {题目传送门}\) 题面 给定一个一个 H*W 的矩形 , 每个坐标上有一个颜色 , 上下左右相邻的同颜色节点可以形成连通块 。 你可以对任意一个连通块 , 进行一次并仅有一次的染色 , 求新形成的连…

Devolutions Server权限提升漏洞分析与修复指南

本文详细分析了CVE-2025-11957漏洞,该漏洞存在于Devolutions Server 2025.2.12.0及更早版本中,由于临时访问工作流程的授权机制存在缺陷,允许经过身份验证的基本用户通过精心构造的API请求自我批准或批准其他用户的…

AI股票预测分析报告 - 2025年10月24日 - 20:08:50

AI股票预测分析报告 - 2025年10月24日body { font-family: "Microsoft YaHei", "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: rgba(51, 51, 51, 1); max-width: 1…

在 Astro 博客中优雅使用 51.la 统计数据

在 Astro 博客中使用 51.la 免费流量统计,通过解析 widget JS 自行渲染访问数据,既保留统计功能,又可自定义展示,让你直观了解博客访客情况作为老牌网站流量统计服务商,51.la 提供每月高达 1000 万次的免费统计额…