1. SqlSugar ORM框架概述
SqlSugar是一款国产轻量级ORM框架,专为.NET平台设计。作为Entity Framework和Dapper之外的第三种选择,它兼具了EF的便捷性和Dapper的高性能特点。最新版本已全面支持.NET 8,并在跨平台开发场景中表现优异。
提示:ORM(Object-Relational Mapping)框架的核心价值在于将数据库表映射为程序中的对象,使开发者能够用面向对象的方式操作数据库,避免手写大量SQL语句。
我在实际项目中使用SqlSugar已有三年时间,从早期的4.x版本到现在的5.x版本,其API设计始终保持高度一致性,这对于长期维护的项目尤为重要。与其他ORM相比,SqlSugar最突出的特点是其"糖式"语法——通过链式调用和Lambda表达式,让数据库操作代码既简洁又强类型安全。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与基础配置
2.1 安装与初始化
通过NuGet安装SqlSugarCore包是最推荐的方式:
bash复制Install-Package SqlSugarCore
基础配置示例(以SQL Server为例):
csharp复制var db = new SqlSugarScope(new ConnectionConfig()
{
ConnectionString = "Server=.;Database=Test;Uid=sa;Pwd=123456",
DbType = DbType.SqlServer,
IsAutoCloseConnection = true
},
db => {
// 全局配置
db.Aop.OnLogExecuting = (sql, pars) =>
{
Console.WriteLine(sql); // 输出执行的SQL
};
});
2.2 常见配置问题解决
根据热词中反映的常见问题,特别提醒:
- 当出现
net::err_cert_authorit等证书错误时,检查NuGet源是否启用HTTPS - 安装.NET 3.5 SP1报错80072efe通常是由于Windows Update服务异常导致
- 跨平台开发时确保安装对应版本的.NET Hosting Bundle
3. 基础更新操作详解
3.1 单实体更新
最基础的更新方式是先查询后修改:
csharp复制var student = db.Queryable<Student>().First();
student.Name = "更新后的名称";
db.Updateable(student).ExecuteCommand();
更高效的方式是使用Where条件直接更新:
csharp复制db.Updateable<Student>()
.SetColumns(it => it.Name == "新名称")
.Where(it => it.Id == 1)
.ExecuteCommand();
3.2 批量更新方案
方案一:使用对象集合
csharp复制var list = db.Queryable<Student>().Take(10).ToList();
list.ForEach(it => it.Status = 1);
db.Updateable(list).ExecuteCommand();
方案二:使用Where条件批量更新
csharp复制db.Updateable<Student>()
.SetColumns(it => it.Status == 2)
.Where(it => it.Age < 18)
.ExecuteCommand();
性能提示:当更新超过1000条记录时,建议采用分页批量提交的方式,避免长时间锁表。
4. 高级更新技巧
4.1 字段表达式更新
使用SetColumns配合表达式可以实现复杂更新逻辑:
csharp复制// 数值字段递增
db.Updateable<Student>()
.SetColumns(it => it.Score == it.Score + 10)
.Where(it => it.ClassId == "A101")
.ExecuteCommand();
// 字符串拼接
db.Updateable<Student>()
.SetColumns(it => it.Remark == it.Remark + "-已处理")
.Where(it => it.Status == 1)
.ExecuteCommand();
4.2 联表更新
SqlSugar支持基于Join的复杂更新:
csharp复制db.Updateable<Student>()
.InnerJoin<Class>((s, c) => s.ClassId == c.Id)
.SetColumns((s, c) => s.Status == c.DefaultStatus)
.Where((s, c) => c.Grade == "2023")
.ExecuteCommand();
4.3 乐观锁实现
在实体类中添加版本号字段:
csharp复制public class Student
{
[SugarColumn(IsVersion = true)]
public long Version { get; set; }
}
更新时会自动校验版本:
csharp复制var student = db.Queryable<Student>().First();
student.Name = "新名字";
var rows = db.Updateable(student).ExecuteCommand();
if(rows == 0) throw new Exception("数据已被修改,请刷新后重试");
5. 特殊场景处理
5.1 JSON字段更新
对于SQL Server等支持JSON的数据库:
csharp复制db.Updateable<Student>()
.SetColumns(it => it.ExtraInfo["Address"].ToString() == "北京市海淀区")
.Where(it => it.Id == 1)
.ExecuteCommand();
5.2 动态条件更新
构建动态Where条件:
csharp复制var exp = Expressionable.Create<Student>();
if(!string.IsNullOrEmpty(keyword))
exp = exp.And(it => it.Name.Contains(keyword));
if(status.HasValue)
exp = exp.And(it => it.Status == status);
db.Updateable<Student>()
.SetColumns(it => it.IsProcessed == true)
.Where(exp.ToExpression())
.ExecuteCommand();
5.3 事务处理
使用事务确保数据一致性:
csharp复制try
{
db.Ado.BeginTran();
// 操作1
db.Updateable<Order>()
.SetColumns(it => it.Status == 2)
.Where(it => it.Id == orderId)
.ExecuteCommand();
// 操作2
db.Updateable<OrderDetail>()
.SetColumns(it => it.IsProcessed == true)
.Where(it => it.OrderId == orderId)
.ExecuteCommand();
db.Ado.CommitTran();
}
catch
{
db.Ado.RollbackTran();
throw;
}
6. 性能优化建议
6.1 批量操作优化
使用BulkUpdate进行海量数据更新(需安装SqlSugar.IExtensions):
csharp复制var list = GetHugeData(); // 获取大量数据
db.Fastest<Student>().BulkUpdate(list); // 比普通更新快10倍以上
6.2 索引命中建议
更新语句的WHERE条件应尽量使用索引列,避免全表扫描。可以通过AOP日志检查生成的SQL:
csharp复制db.Aop.OnLogExecuting = (sql, pars) =>
{
// 分析SQL执行计划
Debug.WriteLine(JsonConvert.SerializeObject(
db.Ado.GetDataTable("EXPLAIN " + sql, pars)));
};
6.3 连接池配置
在频繁更新的场景下,适当调整连接池参数:
csharp复制new ConnectionConfig()
{
// ...其他配置
PoolMin = 5, // 最小连接数
PoolMax = 100, // 最大连接数
ConnectionLifeTime = 300 // 连接存活时间(秒)
}
7. 常见问题排查
7.1 更新无效果问题
检查步骤:
- 确认AOP日志中生成的SQL是否正确
- 检查WHERE条件是否过于严格导致0行匹配
- 验证实体类属性是否有
[SugarColumn(IsIgnore = true)]标记
7.2 并发冲突处理
当出现"数据已被修改"异常时,可采用以下策略:
- 重试机制(适合用户操作场景)
- 最后写入优先(适合系统后台任务)
- 合并冲突数据(需要业务逻辑支持)
7.3 跨数据库兼容
SqlSugar虽然支持多数据库,但某些语法需要特别注意:
csharp复制// 使用SqlFunc类保证跨库兼容
db.Updateable<Student>()
.SetColumns(it => it.UpdateTime == SqlFunc.GetDate())
.ExecuteCommand();
8. 最佳实践总结
在实际项目开发中,我总结了以下SqlSugar更新操作的最佳实践:
- 简单更新优先使用Lambda表达式,避免先查询后修改
- 批量操作使用专用API(如BulkUpdate)
- 重要业务操作必须添加事务保护
- 生产环境开启SQL日志记录但要注意性能影响
- 定期检查长时间运行的更新语句
对于.NET 8项目,建议使用最新版的SqlSugarCore,它在以下方面有显著改进:
- 更好的AOT编译支持
- 更高效的表达式树解析
- 增强的跨平台兼容性
一个典型的更新操作优化前后对比:
csharp复制// 优化前(效率低)
var list = db.Queryable<Order>().Where(...).ToList();
list.ForEach(o => o.Status = 2);
db.Updateable(list).ExecuteCommand();
// 优化后(效率高)
db.Updateable<Order>()
.SetColumns(o => o.Status == 2)
.Where(...)
.ExecuteCommand();
最后提醒:虽然ORM框架方便,但对于超大规模数据迁移或复杂统计场景,适当使用存储过程或原生SQL往往能获得更好的性能。SqlSugar也完美支持这些方式,开发者应根据实际场景灵活选择。
