当前位置: 首页 > news >正文

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 SqlSugarCore

2.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. 常见问题解决方案

在实际项目中,我们遇到过几个典型问题及解决方法:

  1. 字段类型映射问题

    // 明确指定数据库类型 [SugarColumn(ColumnDataType = "varchar(36)")] public string Uuid { get; set; }
  2. 默认值设置失效

    // 使用SQL表达式而非C#值 [SugarColumn(DefaultValue = "GETDATE()")] public DateTime CreateTime { get; set; }
  3. 批量操作超时

    db.Ado.CommandTimeOut = 300; // 设置超时时间为5分钟

经过多个项目的实践验证,以下配置组合在大多数场景下表现良好:

配置项推荐值说明
IsAutoCloseConnectiontrue避免连接泄漏
ConfigureExternalServices自定义配置AOP等扩展
MoreSettings见下表性能相关设置
MoreSettings = new ConnMoreSettings() { IsAutoRemoveDataCache = true, IsWithNoLockQuery = true, SqlServerCodeFirstNvarchar = true }

在最近的一个高并发项目中,通过调整这些配置,系统成功支撑了每秒2000+的订单写入量。关键点在于根据实际业务场景微调参数,而非盲目使用默认值。

http://www.jsqmd.com/news/488726/

相关文章:

  • Autoformer核心机制解析:从时序拆解到自相关注意力
  • CMake 多层级项目构建实战指南
  • 从零开始:用openEuler 22.09搭建openGauss开发环境全记录(含Data Studio连接配置)
  • 猫抓:突破网页媒体资源获取的技术挑战与实践指南
  • 概率论入门:用骰子和硬币理解样本空间与随机事件(附Python代码示例)
  • JDK版本不兼容导致HTTPS握手失败?手把手教你解决TLS协议冲突问题
  • TI电赛开发板(TMS320F28P550)驱动5V光耦隔离继电器模块实战
  • 破解QQ音乐加密格式:qmcdump工具让音乐文件重获自由
  • Secretflow-SPU实战:5分钟搞定Transformer模型隐私推理部署(附避坑指南)
  • 5个ChatGPT提示词实战技巧:从菜鸟到高手的进阶之路(附真实案例)
  • 企业级选择:私有化部署IP查询服务的完整指南(含云服务器配置)
  • Python数据拟合实战:用np.polyfit和np.poly1d搞定你的数学建模作业(附完整代码)
  • OFA-VE镜像免配置价值:对比手动部署节省4.2小时/人·次实测数据
  • logitech-pubg核心技术解析:从原理到实战的创新应用方案
  • Docker 27日志审计能力跃迁(审计日志零丢失实测报告)
  • DASD-4B-Thinking与vLLM集成实战:5步完成AI问答系统部署
  • 衡山派开发板RT-Thread实战:SG90舵机PWM驱动与角度控制详解
  • UML时序图实战:用微信支付案例手把手教你6大核心元素
  • ESP32+WS2812B彩灯实战:从手动IO控制到FastLED库的华丽转身
  • LiuJuan Z-Image Generator效果展示:显存优化前后连续生成100张图稳定性记录
  • 数字IC验证工程师的一天:从测试点分解到UVM环境搭建全流程揭秘
  • 从李雅普诺夫函数到双曲正切:深入理解滑模控制的稳定性设计
  • 从零定制:基于STM32F401CCU开发板的INAV飞控移植实战
  • Python+Selenium实战:教你用自动化脚本搞定12306远程抢票(附邮箱交互技巧)
  • [无缝衔接3D工作流] 设计师与工程师的Rhino到Blender无损数据迁移方案
  • RK3576开发板ROS部署避坑指南:解决Ubuntu下5个最常见编译错误
  • Pi0开源机器人模型安全审计:代码漏洞扫描+第三方依赖风险评估
  • 插件管理的混沌困境:如何用ComfyUI-Manager构建AI创作的秩序引擎
  • apiSQL+GoView:从零到一构建高效数据大屏的实战指南
  • 软件工程学习必备:如何高效利用课后习题提升理解(附第四版答案)