




















SqlSugar是一个功能强大、易用且高性能的 .NET ORM(对象关系映射)框架,由中国开发者创建并维护,专为简化.NET平台的数据库访问而设计。SqlSugar的核心理念是"让数据访问更简单、更高效、更优雅",通过丰富的API和强大的功能,帮助开发者快速构建高质量的数据访问层。
SqlSugar采用 Apache-2.0 开源许可证发布,开发者可以免费用于商业项目。框架托管在GitHub和Gitee平台上:
SqlSugar(SQL糖)这个名称富有深意:
正如其名,SqlSugar就是要为.NET开发者提供最甜蜜的数据访问体验。
SqlSugar的核心定位可以概括为:
| 定位 | 说明 |
|---|---|
| 轻量级ORM | 不是重型框架,核心库体积小,性能优异 |
| 全功能框架 | 提供CRUD、事务、分页、多表联查等完整功能 |
| 多数据库支持 | 支持MySQL、SQL Server、PostgreSQL、Oracle、SQLite等数十种数据库 |
| 开发加速器 | 减少重复代码,大幅提升开发效率 |
| 企业级方案 | 支持分表分库、多租户、分布式事务等企业特性 |
SqlSugar自诞生以来,经历了多个重要的版本迭代:
| 版本 | 发布时间 | 重要特性 |
|---|---|---|
| 1.x | 2015年 | 项目初期,基础CRUD功能 |
| 2.x | 2016年 | 增加多数据库支持 |
| 3.x | 2017年 | 引入CodeFirst和DbFirst |
| 4.x | 2018-2019年 | 性能大幅优化,增加分表功能 |
| 5.x | 2020-至今 | 支持.NET Core/.NET 5+,增加多租户、分布式事务等企业特性 |
SqlSugar拥有中国最活跃的.NET ORM社区之一:
SqlSugar支持完全零SQL开发,通过Lambda表达式和链式API实现所有数据库操作:
// 查询示例 - 无需编写SQL
var users = db.Queryable<User>()
.Where(u => u.Age > 18 && u.Status == 1)
.OrderBy(u => u.CreateTime, OrderByType.Desc)
.ToList();
SqlSugar支持数十种主流和国产数据库,切换数据库只需修改DbType配置:
主流数据库:
国产数据库:
大数据/时序数据库:
云数据库:
SqlSugar在性能方面做了大量优化:
| 性能特性 | 说明 |
|---|---|
| 表达式树编译 | 使用表达式树动态编译,避免反射性能损耗 |
| 对象池技术 | 复用对象,减少GC压力 |
| 批量操作 | 支持高效的批量插入、更新、删除 |
| 异步支持 | 全面支持async/await异步编程 |
| 一级缓存 | 智能缓存,减少数据库访问 |
性能对比(相对值):
CodeFirst(代码优先):
// 定义实体类
public class User
{
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
// 自动创建表
db.CodeFirst.InitTables<User>();
DbFirst(数据库优先):
// 根据现有数据库生成实体类
db.DbFirst.CreateClassFile("c:\\Demo\\Models");
SqlSugar提供原生的分表分库支持,适用于大数据量场景:
// 按年份分表
[SplitTable(SplitType.Year)]
[SugarTable("Order_{year}")]
public class Order
{
public int Id { get; set; }
public DateTime CreateTime { get; set; }
public decimal Amount { get; set; }
}
// 自动路由到正确的分表
var orders = db.Queryable<Order>()
.Where(o => o.CreateTime >= DateTime.Parse("2023-01-01"))
.ToList();
内置多租户支持,轻松实现SaaS应用:
// 配置租户数据库
var tenant = new SqlSugarScope(new ConnectionConfig[]
{
new ConnectionConfig{ ConfigId="tenant1", DbType=DbType.MySql, ConnectionString="..." },
new ConnectionConfig{ ConfigId="tenant2", DbType=DbType.MySql, ConnectionString="..." }
});
// 根据租户ID切换数据库
var db = tenant.GetConnection("tenant1");
SqlSugar提供丰富的AOP拦截点,方便实现日志、审计、性能监控等功能:
db.Aop.OnLogExecuting = (sql, pars) =>
{
Console.WriteLine($"SQL: {sql}");
Console.WriteLine($"参数: {db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value))}");
};
db.Aop.OnError = (exp) =>
{
Console.WriteLine($"错误: {exp.Message}");
};
SqlSugar特别适合以下开发场景:
| 场景 | 原因 |
|---|---|
| 快速原型开发 | API简洁,学习成本低,可快速构建原型 |
| 中小型项目 | 功能全面,无需引入多个组件 |
| 多数据库项目 | 切换数据库极其方便,一套代码多数据库运行 |
| 大数据量项目 | 支持分表分库,性能优异 |
| SaaS多租户系统 | 内置多租户支持 |
| 微服务架构 | 轻量级,适合在微服务中使用 |
| 遗留系统重构 | 可以与现有代码共存,逐步替换 |
以下场景可能需要考虑其他方案:
SqlSugar已被众多企业和项目采用:
| 对比项 | SqlSugar | EF Core |
|---|---|---|
| 学习曲线 | 平缓,API简单直观 | 较陡,概念较多 |
| 性能 | 优秀,接近Dapper | 良好,但较SqlSugar慢 |
| 数据库支持 | 30+种,包括国产数据库 | 主流数据库 |
| 分表分库 | 原生支持 | 需第三方库 |
| 代码优先 | 支持,简单直观 | 支持,功能强大 |
| 迁移功能 | 基础支持 | 强大的Migration |
| 多租户 | 原生支持 | 需自行实现 |
| DDD支持 | 基础支持 | 更完善 |
选择建议:
| 对比项 | SqlSugar | Dapper |
|---|---|---|
| 学习曲线 | 中等 | 平缓 |
| 性能 | 与Dapper相当 | 极佳 |
| 功能完整性 | 完整的ORM功能 | 轻量级Micro-ORM |
| 查询构建 | 链式Lambda表达式 | 需手写SQL |
| 多表联查 | 支持,无需写SQL | 需手写SQL |
| 代码量 | 少 | 较多(需写SQL) |
| 类型安全 | 完全类型安全 | 基本类型安全 |
选择建议:
| 对比项 | SqlSugar | FreeSql |
|---|---|---|
| 诞生时间 | 2015年 | 2019年 |
| 成熟度 | 非常成熟 | 较新但发展快 |
| 文档质量 | 完善 | 完善 |
| 社区活跃度 | 非常活跃 | 活跃 |
| 功能特性 | 非常丰富 | 丰富 |
| API风格 | 简洁直观 | 功能丰富 |
两者都是优秀的.NET ORM框架,选择主要看个人偏好和项目需求。
通过NuGet安装SqlSugar:
# .NET CLI
dotnet add package SqlSugar
# Package Manager Console
Install-Package SqlSugar
根据使用的数据库,可能还需要安装对应的数据库驱动:
# MySQL
dotnet add package MySqlConnector
# SQL Server - 通常.NET已包含
# PostgreSQL
dotnet add package Npgsql
# Oracle
dotnet add package Oracle.ManagedDataAccess.Core
# SQLite
dotnet add package System.Data.SQLite.Core
创建一个简单的控制台应用程序:
using SqlSugar;
using System;
namespace SqlSugarDemo
{
class Program
{
static void Main(string[] args)
{
// 1. 创建数据库连接
SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = "server=localhost;database=testdb;uid=root;pwd=123456;",
DbType = DbType.MySql,
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute
});
// 2. 定义实体类
// 见下方User类定义
// 3. 创建表(CodeFirst)
db.CodeFirst.InitTables(typeof(User));
// 4. 插入数据
db.Insertable(new User
{
Name = "张三",
Age = 25,
Email = "zhangsan@example.com"
}).ExecuteCommand();
// 5. 查询数据
var users = db.Queryable<User>().ToList();
// 6. 输出结果
foreach (var user in users)
{
Console.WriteLine($"ID: {user.Id}, Name: {user.Name}, Age: {user.Age}");
}
}
}
// 实体类定义
public class User
{
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
[SugarColumn(Length = 50)]
public string Name { get; set; }
public int Age { get; set; }
[SugarColumn(Length = 100)]
public string Email { get; set; }
}
}
1. 创建数据库连接
SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = "连接字符串",
DbType = DbType.MySql, // 数据库类型
IsAutoCloseConnection = true, // 自动关闭连接
InitKeyType = InitKeyType.Attribute // 使用特性初始化
});
2. 定义实体类
使用特性标注实体类和属性:
[SugarColumn(IsPrimaryKey = true)]:标识主键[SugarColumn(IsIdentity = true)]:标识自增[SugarColumn(Length = 50)]:指定字段长度3. 创建表
db.CodeFirst.InitTables(typeof(User));
4. 基本操作
db.Insertable(entity).ExecuteCommand()db.Queryable<T>().ToList()db.Updateable(entity).ExecuteCommand()db.Deleteable<T>().Where(...).ExecuteCommand()编译并运行程序:
dotnet run
输出结果:
ID: 1, Name: 张三, Age: 25
| 资源 | 链接 | 说明 |
|---|---|---|
| 官方网站 | https://www.donet5.com | 完整文档和教程 |
| GitHub仓库 | https://github.com/DotNetNext/SqlSugar | 源代码、Issue、PR |
| Gitee镜像 | https://gitee.com/dotnetchina/SqlSugar | 国内访问更快 |
| NuGet包 | https://www.nuget.org/packages/SqlSugar | 下载安装包 |
官方文档:
社区文章:
视频教程:
交流群组:
技术支持:
如果你想为SqlSugar做贡献:
SqlSugar提供商业技术支持服务:
本章我们全面了解了SqlSugar框架:
在下一章,我们将详细学习如何在实际项目中配置和集成SqlSugar。
下一章:第二章:环境配置与项目集成
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。