)
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(DecimalDigits2)] 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: Serverlocalhost;DatabaseECommerce;Uidroot;Pwdyourpassword; } }建议使用依赖注入方式配置SqlSugar在Program.cs中添加builder.Services.AddScopedISqlSugarClient(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 ListOrderItem Items { get; set; } }提示复杂关系建议使用Fluent API配置避免属性标记污染实体类4. 高级迁移与批量处理4.1 数据库初始化策略生产环境推荐使用迁移模式而非直接初始化// 在启动时检查并应用迁移 using (var scope app.Services.CreateScope()) { var db scope.ServiceProvider.GetRequiredServiceISqlSugarClient(); 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.QueryableOrder() .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分钟经过多个项目的实践验证以下配置组合在大多数场景下表现良好配置项推荐值说明IsAutoCloseConnectiontrue避免连接泄漏ConfigureExternalServices自定义配置AOP等扩展MoreSettings见下表性能相关设置MoreSettings new ConnMoreSettings() { IsAutoRemoveDataCache true, IsWithNoLockQuery true, SqlServerCodeFirstNvarchar true }在最近的一个高并发项目中通过调整这些配置系统成功支撑了每秒2000的订单写入量。关键点在于根据实际业务场景微调参数而非盲目使用默认值。