.Net8框架使用Web Core API项目引用SqlSugar教程

.Net8 Web Core API项目使用SqlSugar教程

  • 说明
    • 创建项目
    • 配置依赖包
    • 编写代码
    • 页面调用
    • 实体建表

说明

本文档做入门教程,实现了如何在web环境中搭建,引用SqlSugar并进行增删改查、实体建表、主从库查询等基础操作,对于丰富的SqlSugar API来说是冰山一角。

如想吃透这框架还请去SqlSugar官网中学习,地址:https://www.donet5.com/Home/Doc

在研究的时候,在代码中写了详细的注释,注释内容文档中就不再说明了,自行阅读代码理解。

创建项目

创建一个web项目在这里插入图片描述

配置依赖包

1、右击刚才创建的项目,选择【管理NuGet程序包】
在这里插入图片描述
2、在搜索框中输入:SqlSugar,安装SqlSugarCore在这里插入图片描述

编写代码

1、在appsettings.json配置数据库的信息在这里插入图片描述

2、创建数据库上下文,新建一个Context包,然后在其下创建DbContext类,此类负责数据库的连接和注册配置在这里插入图片描述

using SqlSugar;
using System.Reflection;

namespace TestSugar.Context
{
    public class DbContext
    {
        /*
            1、SqlSugarClient 原生模式访问数据库(性能强)
            2、SqlSugarScope 单例模式访问数据库(使用更简单,性能也不错)
            决定用性能更强的SqlSugarClient
        */
        public SqlSugarClient initDbContext(ConfigurationManager config,string? masterConnStr,string? slaveConnStr)
        {
            SqlSugarClient dbClient = new SqlSugarClient(new ConnectionConfig()
            {
                //定义数据库类型
                DbType = DbType.SqlServer,
                ConnectionString = config.GetConnectionString(masterConnStr),
                IsAutoCloseConnection = true,//自动关闭连接
                // 用于支持实体类中的 [SugarColumn] 特性
                InitKeyType = InitKeyType.Attribute,
                //从库
                SlaveConnectionConfigs = new List<SlaveConnectionConfig>() {
                     new SlaveConnectionConfig() {ConnectionString=config.GetConnectionString(slaveConnStr)}
                },
                ConfigureExternalServices = new ConfigureExternalServices
                {
                    //注意:  这儿AOP设置不能少
                    EntityService = (c, p) =>
                    {
                        /***高版C#写法
                         * 支持string?和string,实体字段没有加?代表建表时该字段不能为null
                         * ***/
                        if (p.IsPrimarykey == false && new NullabilityInfoContext().Create(c).WriteState is NullabilityState.Nullable)
                        {
                            p.IsNullable = true;
                        }
                    }
                }
            }, dbClient =>
            {
                dbClient.Aop.OnLogExecuted = (sql, pars) =>
                {
                    //获取原生SQL推荐  性能OK
                    Console.WriteLine(UtilMethods.GetNativeSql(sql, pars));

                    //获取无参数化SQL 对性能有影响,特别大的SQL参数多的,调试使用
                    //Console.WriteLine(UtilMethods.GetSqlString(DbType.SqlServer,sql,pars))
                };
            });
            return dbClient;
        }
    }
}

2、在Program.cs中依赖注入DbContext类在这里插入图片描述

//IOC注入
/*  1 Transient - 每次请求都会被创建
    2 Scoped - 每次每个客户端请求被创建
    3 Singleton - 只创建一次*/
builder.Services.AddScoped<SqlSugarClient>(s =>
{
    SqlSugarClient sqlSugar = new DbContext().initDbContext(builder.Configuration,"masterConnection","slaveConnection");
    return sqlSugar;
});

4、新建Enitiy包,新建实体类User、Student
在这里插入图片描述

using SqlSugar;
using System.ComponentModel.DataAnnotations.Schema;
using static System.Runtime.InteropServices.JavaScript.JSType;

namespace TestSugar.Entity
{
   [SugarTable("Users")]
    public class User
    {
        [SugarColumn(ColumnName ="Id",IsPrimaryKey = true)]
        public string? Id { get; set; }
        public string? No { get; set; }
        public string? Name { get; set; }
        public int Age { get; set; }
        public string? Sex { get; set; }


    }
}

using SqlSugar;
using System.ComponentModel.DataAnnotations.Schema;
using static System.Runtime.InteropServices.JavaScript.JSType;

namespace TestSugar.Entity
{
    //Data Annotation方式
    [Table("Student", Schema = "dbo")]//指定表
    public class Student
    {
        [SugarColumn(ColumnName = "Id", IsPrimaryKey = true)]
        public string? Id { get; set; }
        //[SugarColumn(IsNullable = true)]
        public string? No { get; set; }
        //[SugarColumn(IsNullable = true)]
        public string? Name { get; set; }
        [SugarColumn(IsIdentity = true)]
        public int Age { get; set; }
        //[SugarColumn(IsNullable = true)]
        [SugarColumn(ColumnName = "Sex")]
        public string? Sex { get; set; }


    }
}

5、我们在User中实现增删改查,在Student中实现自动建表。所以先看User部分。我们可以像以往一样手动的在数据库工具中建立一张Users表,字段和实体对应。
在这里插入图片描述
6、表建好之后,我们开始用代码来操作增删改查,我们需要在项目的Controllers包中增加UserController类在这里插入图片描述

using Microsoft.AspNetCore.Mvc;

using System.Linq.Expressions;
using System.Net;
using System.Reflection.Metadata;
using TestSugar.Context;
using TestSugar.Entity;
using SqlSugar;
namespace TestEFCore.Controllers
{
    [ApiController]
    [Route("api/[controller]/[Action]")]
    public class UserController : ControllerBase
    {
        /* 注入SqlSugarClient
        用法和Dapper、Ado、EF一样 ,不能单例,每个上下文都要是新的对象拥有超高性能,
        使用不当出现偶发错误通过IOC或者db.CopyNew()创建新的对象避免同一个对象在多个上下文使用 ,禁止单例*/
        private readonly SqlSugarClient isc;
        public UserController(SqlSugarClient context)
        {
            isc = context;
        }

        //查询
        [HttpGet]
        public IEnumerable<User> getAllUser_01()
        {
            return isc.Queryable<User>().ToList();
        }

        //异步查询
        [HttpGet]
        public async Task<IEnumerable<User>> getAllUser_02()
        {
            return await isc.Queryable<User>().ToListAsync();
        }

        //查询,用于解决线程问题
        [HttpGet]
        public IEnumerable<User> getAllUser_03()
        {
            var newdb = isc.CopyNew();
            return newdb.Queryable<User>().ToList();
        }

        [HttpGet]
        public IEnumerable<User> getAllUser_04()
        {
            using (var db = isc.CopyNew())
            {
                return isc.Queryable<User>().ToList();
            }
        }

        //查询条件
        [HttpGet]
        public IEnumerable<User> getUserByName(String name)
        {
            //LINQ
            return isc.Queryable<User>().Where(s => s.Name == name).ToList();
        }

        //增加
        [HttpPost]
        public String addUser(String no, String name, int age, String sex)
        {
            Guid guid = Guid.NewGuid();
            try
            {
                isc.BeginTran();//开启事务
                var user = new User { Id = guid.ToString("N"), No = no, Name = name, Age = age, Sex = sex };
                int i = isc.Insertable<User>(user).ExecuteCommand();

                if (i > 0)
                {
                    isc.CommitTran();//提交事务
                    return "ok";

                }
                else
                {
                    return "新增失败";
                }
            }
            catch (Exception ex)
            {
                isc.RollbackTran();//回滚
                return "添加数据发生了错误:" + ex.Message.ToString();
            }
        }

        //修改 异步
        [HttpPost]
        public async Task<String> updateUserById(String id, String? no, String? name, String? age, String? sex)
        {
            try
            {
                await isc.BeginTranAsync();//异步事务
                var user = await isc.Queryable<User>().Where(s => s.Id == id).FirstAsync();
                if (user == null)
                {
                    return "未找到指定数据";
                }
                if (no != null && no != "")
                {
                    user.No = no;
                }
                if (name != null && name != "")
                {
                    user.Name = name;
                }
                if (age != null && age != "")
                {
                    user.Age = int.Parse(age);
                }
                if (sex != null && sex != "")
                {
                    user.Sex = sex;
                }

                int i = await isc.Updateable<User>(user).WhereColumns(u => u.Id).ExecuteCommandAsync();//异步修改,必须给个WhereColumns(u => [字段]),字段最好给不会去修改的,如果给的字段正好参与修改,则修改会失效。

                if (i > 0)
                {
                    await isc.CommitTranAsync();//异步提交
                    return "ok";

                }
                else
                {
                    return "未找到指定数据";
                }
            }
            catch (Exception ex)
            {
                await isc.RollbackTranAsync();//回滚
                return "修改数据发生了错误:" + ex.Message.ToString();
            }
        }

        //删除 UseTran 自动回滚
        [HttpPost]
        public String delUserById_01(String id)
        {
            try
            {
                using (var tran = isc.UseTran())
                {

                    int i = isc.Deleteable<User>().Where(s => s.Id == id).ExecuteCommand();
                    if (i > 0)
                    {
                        tran.CommitTran();//需要手动提交
                        return "ok";

                    }
                    else
                    {
                        return "未找到指定数据";
                    }
                }
            }
            catch (Exception ex)
            {
                return "删除数据发生了错误:" + ex.Message.ToString();
            }
        }

        //删除  自动提交、回滚
        [HttpPost]
        public String delUserById_02(String id)
        {
            int i = 0;
            var result = isc.UseTran(() =>//自动提交
             {
                 i = isc.Deleteable<User>().Where(s => s.Id == id).ExecuteCommand();
             });

            if (result.IsSuccess)
            {
                if (i > 0)
                {
                    return "ok";
                }
                else
                {
                    return "未找到指定数据";
                }
            }
            else
            {
                return "fail";
            }
        }

        //删除 UseTranAsync异步 自动提交、回滚
        [HttpPost]
        public async Task<String> delUserById_03(String id)
        {
            int i = 0;
            var result = await isc.UseTranAsync(async () =>//自动提交
             {
                 i = await isc.Deleteable<User>().Where(s => s.Id == id).ExecuteCommandAsync();
                 //throw new Exception("");//走失败
             });

            if (result.IsSuccess)
            {
                if (i > 0)
                {
                    return "ok";
                }
                else
                {
                    return "未找到指定数据";
                }
            }
            else
            {
                return "fail";
            }
        }
    }
}

7、接下来将项目设为启动项,然后启动项目在这里插入图片描述
8、浏览器就会跳转打开这个界面了,在里面我们可以看到写的接口函数
在这里插入图片描述

页面调用

1、新增user
在这里插入图片描述
2、选择尝试按钮在这里插入图片描述3、填入参数,选择提交在这里插入图片描述
4、结果中出现ok,表示成功在这里插入图片描述5、去数据库看看,可以看到真的添加了一笔,新增完成!在这里插入图片描述
6、删除、查询、修改,都是一样的页面操作,就不介绍了。

实体建表

1、添加StudentController类

using Microsoft.AspNetCore.Mvc;

using System.Linq.Expressions;
using System.Net;
using System.Reflection.Metadata;
using TestSugar.Context;
using TestSugar.Entity;
using SqlSugar;



namespace TestEFCore.Controllers
{
    [ApiController]
    [Route("api/[controller]/[Action]")]
    public class StudentController : ControllerBase
    {
        /* 注入SqlSugarClient
        用法和Dapper、Ado、EF一样 ,不能单例,每个上下文都要是新的对象拥有超高性能,
        使用不当出现偶发错误通过IOC或者db.CopyNew()创建新的对象避免同一个对象在多个上下文使用 ,禁止单例*/
        private readonly SqlSugarClient isc;


        public StudentController(SqlSugarClient context)
        {
            isc = context;
        }

        //建表
        [HttpPost]
        public String createTable()
        {
            try
            {
                isc.CodeFirst.As<Student>("Student2").InitTables<Student>();
            }
            catch (Exception ex)
            {
                return "添加数据发生了错误:" + ex.Message.ToString();
            }
            return "ok";
        }
        //增加
        [HttpPost]
        public String addStu(String no, String name, String sex)
        {
            Guid guid = Guid.NewGuid();
            try
            {
                isc.BeginTran();//开启事务
                var stu = new Student { Id = guid.ToString("N"), No = no, Name = name, Sex = sex };
                isc.Insertable<Student>(stu).ExecuteCommand();
                isc.CommitTran();//提交事务
            }
            catch (Exception ex)
            {
                isc.RollbackTran();//回滚
                return "添加数据发生了错误:" + ex.Message.ToString();
            }
            return "ok";
        }

        //增加
        [HttpPost]
        public String addStu_02(String no, String name, String sex)
        {
            Guid guid = Guid.NewGuid();
            try
            {
                isc.BeginTran();//开启事务
                var stu = new Student { Id = guid.ToString("N"), No = no, Name = name, Sex = sex };
                isc.Insertable<Student>(stu).AS("Student2").ExecuteCommand();
                isc.CommitTran();//提交事务
            }
            catch (Exception ex)
            {
                isc.RollbackTran();//回滚
                return "添加数据发生了错误:" + ex.Message.ToString();
            }
            return "ok";
        }

         //查询
        [HttpGet]
        public IEnumerable<Student> getAllStu_01()
        {   //默认查主库
            return isc.Queryable<Student>().ToList();
        }

         [HttpGet]
        public IEnumerable<Student> getAllStu_02()
        {   //查从库
            return isc.SlaveQueryable<Student>().ToList();
        }
    }
}

2、运行项目,选择创建学生表在这里插入图片描述
3、选择尝试按钮在这里插入图片描述4、在提交之前我删除了之前创建的学生表,现在刷新看下数据库是没有student这张表的在这里插入图片描述
5、点击提交在这里插入图片描述
6、刷新数据库看到,多了一张Student2表,createTable函数中也是这个名字所以没问题,建表成功!学生这里还实现了主从库的查询,代码都写好了直接运行即可,我这里就不一一演示了。在这里插入图片描述在这里插入图片描述在这里插入图片描述## 总结
以上代码都可以粘贴复制到环境中使用,我用的是sql server2019数据库切换也很方面,如果换成其它种类数据库,只需要把 DbContext中的DbType = DbType.SqlServer,这一行的SqlServer替换成你的数据库就行,共有这么多选择。

public enum DbType
{
    MySql = 0,
    SqlServer = 1,
    Sqlite = 2,
    Oracle = 3,
    PostgreSQL = 4,
    Dm = 5,
    Kdbndp = 6,
    Oscar = 7,
    MySqlConnector = 8,
    Access = 9,
    OpenGauss = 10,
    QuestDB = 11,
    HG = 12,
    ClickHouse = 13,
    GBase = 14,
    Odbc = 15,
    OceanBaseForOracle = 16,
    TDengine = 17,
    GaussDB = 18,
    OceanBase = 19,
    Tidb = 20,
    Vastbase = 21,
    PolarDB = 22,
    Doris = 23,
    Custom = 900
}
  • 23
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: .NET Core 3.1 Web API 项目框架是一个用于构建基于RESTful风格的Web API的开发框架。它是.NET Core平台的一部分,可以运行在多个操作系统上,如Windows、Linux和MacOS。以下是该框架的一些主要特点: 1. 跨平台:.NET Core 3.1 Web API可以在多个操作系统上运行,这为开发人员带来了更大的灵活性和便利性。 2. 高性能:.NET Core是一个高性能的框架,可以处理大量的并发请求。它经过优化,能够提供快速响应时间和较低的资源消耗。 3. 轻量级:相比于传统的.NET框架.NET Core是一个更轻量级的框架。它采用了模块化体系结构,可以选择性地引用使用需要的组件,减少了部署包的大小。 4. 开放性:.NET Core 3.1 Web API是一个开放的框架,可以与其他平台和技术进行无缝集成。它支持多种数据格式和协议,如JSON、XML、RESTfulWebSocket等。 5. 高度可扩展:通过使用中间件和自定义管道,开发人员可以方便地扩展和定制Web API的功能。它还支持依赖注入和插件机制,使得代码的组织和测试变得更加简单。 6. 安全性:.NET Core 3.1 Web API提供了强大的安全性功能,包括身份验证、授权、访问控制等。它支持常见的认证方案,如基于令牌的身份验证和OAuth。 总之,.NET Core 3.1 Web API是一个现代化、高效且可扩展的框架,适用于构建各种规模的Web API应用程序。它简化了开发过程,提供了丰富的功能和工具,帮助开发人员快速构建高质量的API。 ### 回答2: .NET Core 3.1 Web API项目框架是用于构建基于RESTful风格的Web服务的开发框架。它是在跨平台、高性能和可扩展性方面进行了优化的框架.NET Core 3.1是一个开源的、跨平台的框架,可以在Windows、Linux和Mac等多个操作系统上运行。这意味着我们可以使用相同的代码和工具来构建应用程序,无需为不同的操作系统创建额外的代码。 Web API是一种使用HTTP协议提供数据交互的应用程序编程接口。它通过HTTP请求(通常是GET、POST、PUT、DELETE)来处理数据,并返回JSON或XML等数据格式作为响应。Web API是一种通用的服务架构,可以与不同平台上的客户端应用程序进行通信。 在.NET Core 3.1 Web API项目框架中,我们可以使用C#来编写API控制器,通过定义不同的API端点和路由来处理不同类型的请求。我们可以使用一些常用的属性(如[HttpGet]、[HttpPost]等)来定义API端点,并使用参数绑定来获取请求中的数据。 框架还提供了丰富的中间件和插件,以处理身份验证、授权、日志记录等常见的开发需求。我们还可以通过使用依赖注入来管理应用程序中的组件和服务。 另外,.NET Core 3.1框架还提供了一些实用的工具和库,例如Entity Framework Core、Swagger等,可以简化数据库访问和API文档生成等任务。 总之,.NET Core 3.1 Web API项目框架是一个强大、灵活和高效的开发框架,可以帮助我们构建出高性能和可靠的Web服务。它具有跨平台的优势,并提供了丰富的功能和工具来简化开发流程。 ### 回答3: .NET Core 3.1是一个跨平台的开发框架,适用于构建不同类型应用的云和互联网解决方案。在.NET Core 3.1中,WebAPI项目框架也得到了重要的改进和功能增强。 首先,.NET Core 3.1的WebAPI项目框架提供了更强大的路由功能,可以使用属性路由来定义API的访问路径,从而更灵活地组织和管理API的接入点。 其次,.NET Core 3.1的WebAPI项目框架引入了端点路由的概念,可以根据不同的HTTP方法和路由规则来映射到不同的动作方法,从而实现更细粒度的控制。 此外,.NET Core 3.1的WebAPI项目框架还提供了更强大的模型绑定功能,可以将请求的数据自动绑定到动作方法的参数上,大大减少了编写冗余代码的工作量。 在数据序列化方面,.NET Core 3.1的WebAPI项目框架支持多种数据格式,包括JSON和XML,可以根据客户端的需求选择合适的数据格式进行传输。 此外,.NET Core 3.1的WebAPI项目框架还提供了强大的中间件支持,可以实现各种功能,如身份验证、授权、异常处理等,极大地提高了开发效率。 总体来说,.NET Core 3.1的WebAPI项目框架在路由、模型绑定、数据序列化和中间件方面都得到了重要的改进和增强,为开发者提供了更强大、更灵活的开发工具,使得构建高性能、可扩展的WebAPI应用变得更加简单和方便。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值