SqlSugar ORM实战:.NET Core中如何用CodeFirst快速生成数据库表(附完整代码)
SqlSugar ORM实战:.NET Core中CodeFirst高效开发全指南
1. 为什么选择CodeFirst开发模式
在.NET Core生态中,ORM框架的选择往往决定了开发效率和维护成本。SqlSugar作为国内开发者广泛使用的轻量级ORM,其CodeFirst模式特别适合快速迭代的敏捷开发场景。与传统DbFirst相比,CodeFirst让开发者能够完全通过C#代码控制数据库结构,实现真正的"代码即文档"。
我曾参与过一个电商平台的重构项目,原有系统采用DbFirst模式导致每次数据库变更都需要同步修改多个位置的脚本文件。迁移到CodeFirst后,团队通过实体类的修改就能自动同步数据库结构,开发效率提升了40%以上。这种开发体验的差异主要体现在:
- 版本控制友好:所有数据库变更都体现在实体类代码中
- 重构安全:字段重命名等操作可以通过迁移脚本自动处理
- 开发流畅:无需在数据库工具和IDE之间频繁切换
// 典型CodeFirst实体类示例 [SugarTable("Products")] public class Product { [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] public int Id { get; set; } [SugarColumn(Length = 100)] public string Name { get; set; } [SugarColumn(DecimalDigits=2)] public decimal Price { get; set; } }2. 环境配置与基础搭建
2.1 项目初始化
首先创建一个新的.NET Core WebAPI项目,并通过NuGet安装SqlSugarCore包:
dotnet new webapi -n ECommerce cd ECommerce dotnet add package SqlSugarCore2.2 数据库连接配置
在appsettings.json中添加数据库连接字符串:
{ "ConnectionStrings": { "DefaultConnection": "Server=localhost;Database=ECommerce;Uid=root;Pwd=yourpassword;" } }建议使用依赖注入方式配置SqlSugar,在Program.cs中添加:
builder.Services.AddScoped<ISqlSugarClient>(provider => { var config = new ConnectionConfig() { ConnectionString = builder.Configuration.GetConnectionString("DefaultConnection"), DbType = DbType.MySql, IsAutoCloseConnection = true }; return new SqlSugarClient(config); });3. 实体设计最佳实践
3.1 基础字段配置
合理的实体设计是CodeFirst成功的关键。以下是一个用户实体的完整示例:
[SugarTable("Users")] public class User { [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] public int Id { get; set; } [SugarColumn(Length = 50, ColumnDescription = "用户登录名")] public string Username { get; set; } [SugarColumn(Length = 100, IsNullable = true)] public string Email { get; set; } [SugarColumn(IsIgnore = true)] public string TemporaryPassword { get; set; } [SugarColumn(DefaultValue = "now()")] public DateTime CreateTime { get; set; } }3.2 关系映射技巧
处理实体间关系时,SqlSugar提供了灵活的配置方式:
// 一对多关系 [SugarTable("Orders")] public class Order { [SugarColumn(IsPrimaryKey = true)] public string OrderId { get; set; } public int UserId { get; set; } [Navigate(NavigateType.OneToOne, nameof(UserId))] public User Owner { get; set; } [SugarColumn(IsIgnore = true)] public List<OrderItem> Items { get; set; } }提示:复杂关系建议使用Fluent API配置,避免属性标记污染实体类
4. 高级迁移与批量处理
4.1 数据库初始化策略
生产环境推荐使用迁移模式而非直接初始化:
// 在启动时检查并应用迁移 using (var scope = app.Services.CreateScope()) { var db = scope.ServiceProvider.GetRequiredService<ISqlSugarClient>(); db.CodeFirst.InitTables(typeof(User), typeof(Product), typeof(Order)); // 更安全的迁移方式 db.DbMaintenance.CreateDatabase(); db.CodeFirst.BackupTable().InitTables(typeof(User)); }4.2 批量生成与更新
通过反射自动注册所有实体:
var entities = Assembly.GetExecutingAssembly() .GetTypes() .Where(t => t.Namespace == "ECommerce.Models") .ToArray(); db.CodeFirst.InitTables(entities);对于已有表的更新,可以使用差异对比功能:
var types = new Type[] { typeof(User), typeof(Product) }; db.CodeFirst.SetStringDefaultLength(100).InitTables(types);5. 性能优化实战技巧
5.1 索引优化配置
直接在实体类上定义索引:
[SugarIndex("idx_user_email", nameof(Email), OrderByType.Asc)] [SugarIndex("idx_user_username", nameof(Username), OrderByType.Asc, true)] // 唯一索引 public class User { // 属性定义... }5.2 分表策略实现
SqlSugar内置了分表支持:
// 按月分表配置 db.CodeFirst .SplitTables() .InitTables(typeof(Order)); // 查询时自动路由 var orders = db.Queryable<Order>() .Where(o => o.CreateTime >= DateTime.Parse("2023-01-01")) .ToList();6. 常见问题解决方案
在实际项目中,我们遇到过几个典型问题及解决方法:
字段类型映射问题:
// 明确指定数据库类型 [SugarColumn(ColumnDataType = "varchar(36)")] public string Uuid { get; set; }默认值设置失效:
// 使用SQL表达式而非C#值 [SugarColumn(DefaultValue = "GETDATE()")] public DateTime CreateTime { get; set; }批量操作超时:
db.Ado.CommandTimeOut = 300; // 设置超时时间为5分钟
经过多个项目的实践验证,以下配置组合在大多数场景下表现良好:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| IsAutoCloseConnection | true | 避免连接泄漏 |
| ConfigureExternalServices | 自定义 | 配置AOP等扩展 |
| MoreSettings | 见下表 | 性能相关设置 |
MoreSettings = new ConnMoreSettings() { IsAutoRemoveDataCache = true, IsWithNoLockQuery = true, SqlServerCodeFirstNvarchar = true }在最近的一个高并发项目中,通过调整这些配置,系统成功支撑了每秒2000+的订单写入量。关键点在于根据实际业务场景微调参数,而非盲目使用默认值。
