0


.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类,此类负责数据库的连接和注册配置在这里插入图片描述

usingSqlSugar;usingSystem.Reflection;namespaceTestSugar.Context{publicclassDbContext{/*
            1、SqlSugarClient 原生模式访问数据库(性能强)
            2、SqlSugarScope 单例模式访问数据库(使用更简单,性能也不错)
            决定用性能更强的SqlSugarClient
        */publicSqlSugarClientinitDbContext(ConfigurationManager config,string? masterConnStr,string? slaveConnStr){SqlSugarClient dbClient =newSqlSugarClient(newConnectionConfig(){//定义数据库类型
                DbType = DbType.SqlServer,
                ConnectionString = config.GetConnectionString(masterConnStr),
                IsAutoCloseConnection =true,//自动关闭连接// 用于支持实体类中的 [SugarColumn] 特性
                InitKeyType = InitKeyType.Attribute,//从库
                SlaveConnectionConfigs =newList<SlaveConnectionConfig>(){newSlaveConnectionConfig(){ConnectionString=config.GetConnectionString(slaveConnStr)}},
                ConfigureExternalServices =newConfigureExternalServices{//注意:  这儿AOP设置不能少
                    EntityService =(c, p)=>{/***高版C#写法
                         * 支持string?和string,实体字段没有加?代表建表时该字段不能为null
                         * ***/if(p.IsPrimarykey ==false&&newNullabilityInfoContext().Create(c).WriteState isNullabilityState.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 =newDbContext().initDbContext(builder.Configuration,"masterConnection","slaveConnection");return sqlSugar;});

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

usingSqlSugar;usingSystem.ComponentModel.DataAnnotations.Schema;usingstaticSystem.Runtime.InteropServices.JavaScript.JSType;namespaceTestSugar.Entity{[SugarTable("Users")]publicclassUser{[SugarColumn(ColumnName ="Id",IsPrimaryKey =true)]publicstring? Id {get;set;}publicstring? No {get;set;}publicstring? Name {get;set;}publicint Age {get;set;}publicstring? Sex {get;set;}}}
usingSqlSugar;usingSystem.ComponentModel.DataAnnotations.Schema;usingstaticSystem.Runtime.InteropServices.JavaScript.JSType;namespaceTestSugar.Entity{//Data Annotation方式[Table("Student", Schema ="dbo")]//指定表publicclassStudent{[SugarColumn(ColumnName ="Id", IsPrimaryKey =true)]publicstring? Id {get;set;}//[SugarColumn(IsNullable = true)]publicstring? No {get;set;}//[SugarColumn(IsNullable = true)]publicstring? Name {get;set;}[SugarColumn(IsIdentity =true)]publicint Age {get;set;}//[SugarColumn(IsNullable = true)][SugarColumn(ColumnName ="Sex")]publicstring? Sex {get;set;}}}

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

usingMicrosoft.AspNetCore.Mvc;usingSystem.Linq.Expressions;usingSystem.Net;usingSystem.Reflection.Metadata;usingTestSugar.Context;usingTestSugar.Entity;usingSqlSugar;namespaceTestEFCore.Controllers{[ApiController][Route("api/[controller]/[Action]")]publicclassUserController:ControllerBase{/* 注入SqlSugarClient
        用法和Dapper、Ado、EF一样 ,不能单例,每个上下文都要是新的对象拥有超高性能,
        使用不当出现偶发错误通过IOC或者db.CopyNew()创建新的对象避免同一个对象在多个上下文使用 ,禁止单例*/privatereadonlySqlSugarClient isc;publicUserController(SqlSugarClient context){
            isc = context;}//查询[HttpGet]publicIEnumerable<User>getAllUser_01(){return isc.Queryable<User>().ToList();}//异步查询[HttpGet]publicasyncTask<IEnumerable<User>>getAllUser_02(){returnawait isc.Queryable<User>().ToListAsync();}//查询,用于解决线程问题[HttpGet]publicIEnumerable<User>getAllUser_03(){var newdb = isc.CopyNew();return newdb.Queryable<User>().ToList();}[HttpGet]publicIEnumerable<User>getAllUser_04(){using(var db = isc.CopyNew()){return isc.Queryable<User>().ToList();}}//查询条件[HttpGet]publicIEnumerable<User>getUserByName(String name){//LINQreturn isc.Queryable<User>().Where(s => s.Name == name).ToList();}//增加[HttpPost]publicStringaddUser(String no,String name,int age,String sex){Guid guid = Guid.NewGuid();try{
                isc.BeginTran();//开启事务var user =newUser{ 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]publicasyncTask<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]publicStringdelUserById_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]publicStringdelUserById_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]publicasyncTask<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类

usingMicrosoft.AspNetCore.Mvc;usingSystem.Linq.Expressions;usingSystem.Net;usingSystem.Reflection.Metadata;usingTestSugar.Context;usingTestSugar.Entity;usingSqlSugar;namespaceTestEFCore.Controllers{[ApiController][Route("api/[controller]/[Action]")]publicclassStudentController:ControllerBase{/* 注入SqlSugarClient
        用法和Dapper、Ado、EF一样 ,不能单例,每个上下文都要是新的对象拥有超高性能,
        使用不当出现偶发错误通过IOC或者db.CopyNew()创建新的对象避免同一个对象在多个上下文使用 ,禁止单例*/privatereadonlySqlSugarClient isc;publicStudentController(SqlSugarClient context){
            isc = context;}//建表[HttpPost]publicStringcreateTable(){try{
                isc.CodeFirst.As<Student>("Student2").InitTables<Student>();}catch(Exception ex){return"添加数据发生了错误:"+ ex.Message.ToString();}return"ok";}//增加[HttpPost]publicStringaddStu(String no,String name,String sex){Guid guid = Guid.NewGuid();try{
                isc.BeginTran();//开启事务var stu =newStudent{ 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]publicStringaddStu_02(String no,String name,String sex){Guid guid = Guid.NewGuid();try{
                isc.BeginTran();//开启事务var stu =newStudent{ 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]publicIEnumerable<Student>getAllStu_01(){//默认查主库return isc.Queryable<Student>().ToList();}[HttpGet]publicIEnumerable<Student>getAllStu_02(){//查从库return isc.SlaveQueryable<Student>().ToList();}}}

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

publicenumDbType{
    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}
标签: .net 前端 sqlserver

本文转载自: https://blog.csdn.net/junxkkoo/article/details/139471760
版权归原作者 有bug才精彩 所有, 如有侵权,请联系我们删除。

“.Net8框架使用Web Core API项目引用SqlSugar教程”的评论:

还没有评论