从零开始:在.NET Core中快速集成SqlSugar ORM

发布于:2025-02-24 ⋅ 阅读:(19) ⋅ 点赞:(0)

目录

初识SqlSugar

DbFirst操作

CodeFirst操作

索引概念及操作

初识SqlSugar

ORM框架:是一种用于简化数据库操作的技术,它通过将面向对象编程中的对象(如类和实例)与关系型数据库中的表和记录进行映射,提供了一种便捷的方式来进行数据持久化操作,说白了ORM 框架就是允许开发者以对象的方式操作数据库而不需要直接编写SQL语句

今天介绍的SqlSugar是一个轻量级且功能强大的.NET ORM框架,它旨在简化数据库操作并提高开发效率,SqlSugar提供了一种简单灵活的方式来进行数据库的增删改查(CRUD)操作,同时也支持更复杂的查询和数据库事务管理,具体大家可以参考:官网 ,里面也是非常详细的介绍了关于该框架的使用,目前SqlSugar也是更新到了5版本,如下所示:

SqlSugar的支持功能主要有以下几个方面:

1)支持NET百万级【大数据】写入和更新、分表和几十亿查询和统计等拥有成熟方案

2)支持完整的SAAS一套应用跨库查询、租户分库、租户分表和租户数据隔离

3)支持【低代码】+工作流(无实体多库兼容CRUD&JSONTOSQL)

4)语法最爽的ORM、优美的表达式、仓储、UnitOfWork、DbContext、AOP

5)支持DbFirst、CodeFirst和【WebFirst】3种模式开发

6)简单易用、功能齐全、高性能、轻量级、服务齐全、官网教程文档

SqlSugar所支持的数据库也是比较全面的,基本上涵盖了所有比较热门的数据库:

数据库类型 支持
关系型数据库

MySql、SqlServer、Sqlite、Oracle、postgresql、达梦、人大金仓、神通数据库、

瀚高、Access、MySqlConnector、华为GaussDB、南大通用GBase、Odbc、自定义

时序数据库 QuestDb(适合几十亿数据分析,模糊查询,自动分表存储,缺点不支持删除)
列式数据库 Clickhouse(适用于商业智能领域(Bl),缺点大小写必须和库一样,不支持事务)
其他数据库 Mongodb(mongodb.entities)TDengine、Sybase、hana、FireBird

安装SqlSugar的话直接点击引用,右键管理Nuget程序包搜索SqlSugarCore进行安装,如下所示:

安装完成之后,接下来就是对数据库进行操作了,后面相关SqlSugar系列的文章都会以MySQL数据库进行举例,这里就不再讲解MySQL的基础知识了,详细了解请参考 MySQL专栏 ,掌握完数据库的基本操作之后接下来我们就需要掌握数据库编程操作,在数据库编程中DbFirst和CodeFirst是两种常见的开发方法,主要用于数据库与应用程序代码之间的映射和交互,它们的区别在于数据库模型与代码模型的创建顺序和方式:

DbFirst操作

DbFirst:是指先创建数据库再根据数据库结构生成代码模型,在这种方法中数据库表是先创建的,之后根据已有的数据库表生成相应的实体类和数据访问层代码。

优点:快速生成代码,尤其适用于已有数据库,数据库先行,适合传统的数据库驱动开发

缺点:灵活性稍差,特别是对于复杂的业务逻辑和数据库变化较频繁的场景

举个例子来讲解一下DbFirst的操作,这里我们通过SqlSugarClient原生模式访问数据库,然后设置生成实体类的配置,这里我们将其抽离出一个工具函数,连接数据库字符串通过appsettings.json文件进行读取,如下所示:

namespace webapi_study
{
    public class DbFirstGenerator
    {
        public static void GenerateEntities()
        {
            // 配置文件路径
            var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json");

            // 加载配置文件
            var configuration = builder.Build();

            // 从配置中读取连接字符串
            string connectionString = configuration.GetConnectionString("DefaultConnection");

            // 创建 SqlSugarClient 实例
            var db = new SqlSugarClient(new ConnectionConfig
            {
                ConnectionString = connectionString, // 使用读取的连接字符串
                DbType = DbType.MySql, // 根据实际数据库类型修改
                IsAutoCloseConnection = true // 自动关闭连接
            });

            // 设置生成实体类的配置
            db.DbFirst
              .IsCreateAttribute() // 是否生成特性
              .IsCreateDefaultValue() // 是否生成默认值
              .CreateClassFile(@"E:\visualStudio\webapi-study\webapi-study\Models", "webapi_study.Models"); // 生成实体类的路径和命名空间
        }
    }
}

然后我们在入口文件处调用一下生成实体类的函数:

运行项目之后,我们生成了一个Models文件夹,该文件夹下就已经生成了我们对应数据库表中所有的实体类内容,可以看到所有字段的注释都帮助我们自动生成了,并且它还是生成的一个partial类,该类允许将自动生成的代码与手动编写的代码分离开来:

当然对于DbFirst还有许多其他设置,具体可以参考 官方文档 ,这里不再过多赘述:

CodeFirst操作

CodeFirst:是指先创建代码模型然后根据代码模型生成数据库结构,在这种方法中开发者先编写实体类然后通过工具或框架(如Entity Framework)根据这些实体类生成相应的数据库表。

优点:更具灵活性可以直接在代码中定义数据库结构易于维护,方便地管理数据库变更

缺点:如果数据库设计较复杂或者已有现成的数据库,转换到CodeFirst可能需要额外的工作

举个例子来讲解一下CodeFirst的操作,首先我们需要在项目中定义实体类,这些实体类将映射到数据库中的表,例如要创建一个 User 表,对应的实体类可以这样定义:

using SqlSugar;

namespace webapi_study.Models
{
    [SugarTable("Users")] // 指定表名
    public class User
    {
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] // 主键且自增
        public int Id { get; set; }

        [SugarColumn(Length = 50)] // 指定字段长度
        public string Name { get; set; }

        [SugarColumn(Length = 100)]
        public string Email { get; set; }
    }
}

对于通过SqlSugar来设置这个实体类,其中对应的一些参数等相关配置,可以参考下面这张表:

名称 描述
IsIdentity 是否创建自增标识
IsPrimaryKey 是否创建主键标识
ColumnName 创建数据库字段的名称(默认取实体类属性名称)
ColumnDataType 创建数据库字段的类型,不设置该参数系统会根据C#类型自动生成相应的数据库类型 
IsIgnore ORM不处理该列
ColumnDescription 备注,表注释
Length 长度,设成10会生成xxx类型(10),没括号的不设置
IsNullable 是否可以为null默为false
DecimalDigits 精度 如 decimal(18,2) length=18,DecimalDigits=2
OracleSequenceName 设置Oracle序列,设置后该列等同于自增列
OldColumnName 修改列名用,这样不会新增或者删除列
DefaultValue  默认值,用来建表设置字段默认值
IsOnlyIgnoreInsert  IsOnlyIgnoreInsert=true,插入数据时取默认值
IndexGroupNameList 创建索引用
UniqueGrpupNameList 创建唯一索引
string 字符串

public string FieldName{ get; set; } 

int 整数 public int FieldName{ get; set; }
short 整数 public short FieldName{ get; set; }
枚举 (数据库存int) public 枚举 FieldName{ get; set; }
bool  真假 public bool FieldName{ get; set; }
DateTime 时间 public DateTime FieldName{ get; set; }

然后这里我们通过SqlSugarClient原生模式访问数据库,然后设置数据库表的配置,这里我们将其抽离出一个工具函数,连接数据库字符串通过appsettings.json文件进行读取,如下所示:

using SqlSugar;

namespace webapi_study
{
    public class CodeFirstGenerator
    {
        public static void CreateDatabaseTables()
        {
            // 配置文件路径
            var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json");

            // 加载配置文件
            var configuration = builder.Build();

            // 从配置中读取连接字符串
            string connectionString = configuration.GetConnectionString("DefaultConnection");

            // 创建 SqlSugarClient 实例
            var db = new SqlSugarClient(new ConnectionConfig
            {
                ConnectionString = connectionString, // 使用读取的连接字符串
                DbType = DbType.MySql, // 根据实际数据库类型修改
                IsAutoCloseConnection = true // 自动关闭连接
            });

            // CodeFirst 创建数据库表
            db.CodeFirst.InitTables(typeof(webapi_study.Models.User));
            // 如果有多个实体类,可以继续添加,例如:
            // db.CodeFirst.InitTables(typeof(webapi_study.Models.User), typeof(webapi_study.Models.Order));
        }
    }
}

然后在Program.cs文件中调用CreateDatabaseTables方法来创建数据库表,最终可以看到我们的数据库当中已经成功的将User表创建出来了:

当然我们还可以通过反射来批量获取指定命名空间下的所有实体类的Type进行批量创建表:

// 使用反射获取指定命名空间下的所有实体类的 Type
var entityTypes = Assembly.GetExecutingAssembly().GetTypes()
    .Where(t => t.Namespace == "webapi_study.Models")
    .ToArray();

// CodeFirst 批量创建数据库表
db.CodeFirst.InitTables(entityTypes);

当然 对于CodeFirst还有许多其他设置,具体可以参考 官方文档 ,这里不再过多赘述:

总结:DbFirst适用于已有数据库的开发,通过数据库生成代码;CodeFirst适用于从零开始的开发,通过代码生成数据库,这两种方法都有其应用场景,开发者可以根据项目需求团队的开发流程以及数据库的现有状态来选择适合的方式。

索引概念及操作

在SqlSugar中索引是数据库中用于提高查询速度的一个重要机制,通过为特定的列创建数据结构使得查询能够更快速地定位到需要的数据,可以将索引看作是数据库表中数据的“目录”,能够帮助加速数据检索,但在插入、更新和删除数据时会增加一些开销,对于数据库索引的操作可以参考我之前的文章:地址 这里不再赘述,当我们使用Code First创建表结构之后,可以给其中的一些字段添加对应的索引,操作如下:

namespace webapi_study.Models
{
    [SugarIndex("index_name", nameof(User.Name), OrderByType.Asc)] // 创建普通索引
    [SugarIndex("index_email", nameof(User.Email), OrderByType.Desc, true)] // 创建唯一索引(true表示唯一索引)
    [SugarIndex("index_nameid", nameof(User.Name), OrderByType.Asc, nameof(User.Id), OrderByType.Desc)] // 创建组合索引

    [SugarTable("Users")] // 指定表名
    public class User
    {
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] // 主键且自增
        public int Id { get; set; }

        [SugarColumn(Length = 50)] // 指定字段长度
        public string Name { get; set; }

        [SugarColumn(Length = 100)]
        public string Email { get; set; }
    }
}

来到数据库可以看到我们的索引已经被成功创建出来了: