【个人博客搭建】(5)Sqlsugar实体创建数据库数据

news2024/11/25 4:53:46

1、在appsettings.json文件中配置SqlServer数据库连接字符串信息。(后续考虑添加MySQL数据库等类型)

  "DBS": [
    /*
      对应下边的 DBType
      MySql = 0,
      SqlServer = 1,
    */
    {
      "ConnId": "plateau.poetize.2024",
      "DBType": 1,
      "Connection": "Data Source=DESKTOP-1AFG6N7\\YGRSZC;Initial Catalog=plateau.poetize;Persist Security Info=True;User ID=sa;Password=123456",
    }
  ]

2、创建sqlsugar对象。

        2.1、注入服务。在Program.cs文件中,在var app = builder.Build();这句话之前,加入下列代码(需要添加sqlsugar nuget引用)

来源:简单示例,1分钟入门 - SqlSugar 5x - .NET果糖网。【1.2 原生模式使用IOC】

//注册上下文:AOP里面可以获取IOC对象,如果有现成框架比如Furion可以不写这一行
services.AddHttpContextAccessor();
//注册SqlSugar用AddScoped
services.AddScoped<ISqlSugarClient>(s =>
{
    //Scoped用SqlSugarClient 
    SqlSugarClient sqlSugar = new SqlSugarClient (new ConnectionConfig()
    {
        DbType = SqlSugar.DbType.Sqlite,
        ConnectionString = "DataSource=sqlsugar-dev.db",
        IsAutoCloseConnection = true,
    },
   db =>
   {
      //每次上下文都会执行
            
      //获取IOC对象不要求在一个上下文
      //var log=s.GetService<Log>()
                
      //获取IOC对象要求在一个上下文
      //var appServive = s.GetService<IHttpContextAccessor>();
      //var log= appServive?.HttpContext?.RequestServices.GetService<Log>();
                 
       db.Aop.OnLogExecuting = (sql, pars) =>
       {
        
       };
   });
    return sqlSugar;
});

        2.2、读取json文件处理方法。在Tools项目下创建AppSettings类。

我这里会引用Microsoft.Extensions.Configuration.Abstractions、Microsoft.Extensions.Configuration.Binder两个包。也可以百度其他方式实现

   
   using Microsoft.Extensions.Configuration;

   /// <summary>
   /// appsettings.json操作类
   /// </summary>
   public class AppSettings
   {
       //引用Microsoft.Extensions.Configuration.Abstractions
       public static IConfiguration Configuration { get; set; }

       public AppSettings(IConfiguration configuration)
       {
           Configuration = configuration;
       }

       /// <summary>
       /// 封装要操作的字符
       /// </summary>
       /// <param name="sections">节点配置</param>
       /// <returns></returns>
       public static string app(params string[] sections)
       {
           try
           {
               if (sections.Any())
               {
                   return Configuration[string.Join(":", sections)];
               }
           }
           catch (Exception)
           {
           }

           return "";
       }

       /// <summary>
       /// 递归获取配置信息数组
       /// </summary>
       /// <typeparam name="T"></typeparam>
       /// <param name="sections"></param>
       /// <returns></returns>
       public static List<T> app<T>(params string[] sections)
       {
           List<T> list = new List<T>();
           // 引用 Microsoft.Extensions.Configuration.Binder 包
           Configuration.Bind(string.Join(":", sections), list);
           return list;
       }


       /// <summary>
       /// 根据路径  configuration["App:Name"];
       /// </summary>
       /// <param name="sectionsPath"></param>
       /// <returns></returns>
       public static string GetValue(string sectionsPath)
       {
           try
           {
               return Configuration[sectionsPath];
           }
           catch (Exception)
           {
           }

           return "";
       }
   }

        2.3、使用模型来接收配置的参数json数据格式

    /// <summary>
    /// 数据库模型
    /// </summary>
    public class DBSOperate
    {
        /// <summary>
        /// 连接ID
        /// </summary>
        public string ConnId { get; set; }

        /// <summary>
        /// 连接字符串
        /// </summary>
        public string Connection { get; set; }

        /// <summary>
        /// 数据库类型
        /// </summary>
        public DataBaseType DbType { get; set; }
    }

    public enum DataBaseType
    {
        MySql = 0,
        SqlServer = 1,
    }

        2.4、读取数据。然后把找到的值代替到创建SqlSugarClient sqlSugar的参数中去。(这里因为目前就规划两种数据库,所以简单判断一下,并以SqlServer为主)

//获取json数据库配置
List<DBSOperate> listdatabase = AppSettings.app<DBSOperate>("DBS").ToList();
var ConnectionString = listdatabase.FirstOrDefault().Connection;
DbType dbtype = (int)listdatabase.FirstOrDefault().DbType == 2 ? SqlSugar.DbType.MySql : SqlSugar.DbType.SqlServer;

        2.5、添加SQL语句打印。我们选用Aop.OnLogExecuted下执行。内容可以自定义。

也可以拓展一些别的aop。可以去看官方AOP、日志、拦截、差异日志 - SqlSugar 5x - .NET果糖网

//SQL执行完
db.Aop.OnLogExecuted = (sql, par) =>
{
    //SQL语句打印
    Console.WriteLine("\r\n");
    Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")}执行的SQL语句是:" + sql);
    Console.WriteLine("=============================================");
};

3、创建表。(后加到接口去)

       //【TODO:Source】 https://www.donet5.com/home/Doc?typeId=1206 2.1 纯特性建表(建表、批量建表)
       /***批量创建表***/
       //语法1:
       var modelsName = "plateau.poetize.blog.Models";
       Type[] types = Assembly
               .LoadFrom(modelsName + ".dll")//如果 .dll报错,可以换成 xxx.exe 有些生成的是exe 
               .GetTypes().Where(it => it.FullName.Contains(modelsName +".Entitys"))//命名空间过滤,可以写其他条件
               .ToArray();//断点调试一下是不是需要的Type,不是需要的在进行过滤

       db.CodeFirst.SetStringDefaultLength(200).InitTables(types);//根据types创建表

4、测试。

        4.1、报错,AppSettings的app方法,Configuration=null。问题点是没有注册进去。加进去即可,建议在sqlsugar之前吧。

#region 读取Json配置文件

builder.Services.AddSingleton(new AppSettings(builder.Configuration));

#endregion

        4.2、运行成功。

(ps:No operations defined in spec!翻译为:规范中没有定义任何操作!)

这是因为我把原始的案例接口文件给删除了,后加接口即可

5、添加接口测试。

        5.1、添加文件,在Api项目下Controller文件夹右击添加控制器,然后选用api,再选空的那个。再修改成自己想需要的名称即可

创建成功后就是默认的一些代码。

这里

[Route]:代表路由,我这改成了[Route("blogApi/[controller]/[action]")],

        第一节blogApi代表一个前缀的功能,也可以再多加几节都可以。

        [controller]代表的是:当前控制器的名称,运行后也就是SqlSugar这几个字

        [action]代表的是:当前控制器下的接口名称

[ApiController]:这个就是代表api的特性标识,后续的swagger就是依据这生成的。

        5.2、添加接口

                5.2.1、控制器层:

    [Route("blogApi/[controller]/[action]")]
    [ApiController]
    public class SqlSugarController : ControllerBase
    {
        public ISqlSugarToolService _iSQLSugarToolService;

        public SqlSugarController(ISqlSugarToolService iSQLSugarToolService)
        {
            _iSQLSugarToolService = iSQLSugarToolService;
        }



        /// <summary>
        /// 测试连接
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public string Test()
        {
            return "Test,OK";
        }


        /// <summary>
        /// 初始化。根据实体生成数据库表
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public string InitDataStructure()
        {
            var result = _iSQLSugarToolService.InitDataStructure();
            return result;
        }
    }

                5.2.2、接口层:

    public interface ISqlSugarToolService
    {
        string InitDataStructure();
    }

                5.2.3、服务层

public class SqlSugarToolService : ISqlSugarToolService
{

    private ISqlSugarClient _sqlSugarClient;
    public SqlSugarToolService(ISqlSugarClient sqlSugarClient) 
    {
        _sqlSugarClient = sqlSugarClient;
    }
    public string InitDataStructure()
    {
        var result = "未成功";

        try
        {
            //【TODO:Source】 https://www.donet5.com/home/Doc?typeId=1206 2.1 纯特性建表(建表、批量建表)
            /***批量创建表***/
            //语法1:
            var modelsName = "plateau.poetize.blog.Models";
            Type[] types = Assembly
                    .LoadFrom(modelsName + ".dll")//如果 .dll报错,可以换成 xxx.exe 有些生成的是exe 
                    .GetTypes()
                    .Where(it => it.IsClass ==true  && it.FullName.Contains(modelsName + ".Entitys"))//命名空间过滤,可以写其他条件
                    .ToArray();//断点调试一下是不是需要的Type,不是需要的在进行过滤

            //循环处理
            foreach (var type in types)
            {
                // 这里只支持添加表,不支持删除
                // 如果想要删除,数据库直接右键删除
                if (!_sqlSugarClient.DbMaintenance.IsAnyTable(type.Name))
                {
                    Console.WriteLine(type.Name);
                    _sqlSugarClient.CodeFirst.SplitTables().InitTables(type);
                }
            }

            直接
            //_sqlSugarClient.CodeFirst.SetStringDefaultLength(200).InitTables(types);//根据types创建表


        }
        catch (Exception ex)
        {
            result = "异常失败。" + ex.Message.ToString();
            throw;
        }

        return result;
    }
}

5.3、运行:

        5.3.1、失败:

        5.3.2、处理问题。(接口与服务层实现问题)在入口文件中添加关系。

#region 接口与服务层关系

builder.Services.AddTransient<ISqlSugarToolService, SqlSugarToolService>();

#endregion

        5.3.3、测试Test接口。我稍微改了下接口,加了输入的文字

        5.3.4、测试最后的生成表接口。

                出现问题:1、系统找不到指定的文件。(路径出现问题了)

修改代码:添加绝对路径。

var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;

.LoadFrom(path + modelsName + ".dll")

修复后:

                出现问题:2、SqlSugar.SqlSugarException:“中文提示 :  连接数据库过程中发生错误,检查服务器是否正常连接字符串是否正确,错误信息:Only the invariant culture is supported in globalization-invariant mode. See https://aka.ms/GlobalizationInvariantMode for more information. (Parameter 'name')
en-us is an invalid culture identifier.DbType="SqlServer";ConfigId="".
English Message : Connection open error . Only the invariant culture is supported in globalization-invariant mode. See https://aka.ms/GlobalizationInvariantMode for more information. (Parameter 'name')
en-us is an invalid culture identifier.DbType="SqlServer";ConfigId="" ”

问题点出现在代码:if (!_sqlSugarClient.DbMaintenance.IsAnyTable(type.Name))这。

处理方式:双击Api项目,然后修改InvariantGlobalization节点的值为false,默认为true。

(创建Net8 WebApi配套sqlsugar都会出现)

        5.3.5、最后也就是处理完成了。顺利生成。然后附带一下打印的SQL。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1600539.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分类损失函数与评估指标

目录 1 评估指标 1.1 准确率 1.2 精确率 1.3 召回率 1.4 F1 score 1.5 ROC曲线 1.6 AUC 1.7 PRC曲线的优势 2 损失函数 1. 负对数似然损失 2. 交叉熵损失 3. 指数损失 3 分类问题为什么用交叉熵损失不用 MSE 损失 1 评估指标 混淆矩阵 TP(True Positive) ---- 正…

锂电池充放电管理-单片机通用

锂电池充放电管理-单片机通用 一、锂电池充放电检测的原理二、power.c的实现三、power.h的实现四、锂电池检测和充电电路 一、锂电池充放电检测的原理 ①两节锂电池通过电阻分压检测ADC&#xff0c;再根据电压划分电量等级&#xff1b;②充电使用的是锂电池充电IC方案&#xf…

区块链与数字身份:Web3的身份验证革命

随着数字化时代的发展&#xff0c;个人身份认证在日常生活和商业活动中变得越来越重要。然而&#xff0c;传统的身份认证方式存在着许多问题&#xff0c;如安全性不足、数据泄露、信息篡改等。而区块链技术的出现为数字身份认证带来了全新的解决方案。本文将深入探讨区块链与数…

无人零售行业展望:智能化与便利性引领未来

无人零售行业展望&#xff1a;智能化与便利性引领未来 无人零售&#xff0c;这一依靠智能化技术如人工智能、物联网、和大数据的零售模式&#xff0c;正逐步成为全球零售行业的新趋势。该模式允许消费者在没有店员的情况下自助完成购物&#xff0c;提供了24小时服务&#xff0…

【Web】陇原战“疫“2021网络安全大赛 题解

目录 CheckIN eaaasyphp EasyJaba CheckIN 拿到附件&#xff0c;贴出关键代码 func getController(c *gin.Context) {cmd : exec.Command("/bin/wget", c.QueryArray("argv")[1:]...)err : cmd.Run()if err ! nil {fmt.Println("error: ", …

Web3.0与AI的交融:开启智能互联网新时代

目前有140 多个 Web3 AI 概念项目&#xff0c;覆盖了基础设施、数据、预测市场、计算与算力、教育、DeFi & 跨链、安全、NFT & 游戏 & 元宇宙、搜索引擎、社交 & 创作者经济、AI 聊天机器人、DID & 消息传递、治理、医疗、交易机器人等诸多方向。持续关注…

SQLite数据库中JSON 函数和运算符

返回&#xff1a;SQLite—系列文章目录 上一篇:维护SQLite的私有分支&#xff08;二十六&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 ​ 1. 概述 默认情况下&#xff0c;SQLite 支持 29 个函数和 2 个运算符 处理 JSON 值。还有两个表值函数可用于分解 JSON…

二级综合医院云HIS系统源码,B/S架构,采用JAVA编程,集成相关医保接口

二级医院云HIS系统源码 云HIS系统是一款满足基层医院各类业务需要的健康云产品。该产品能帮助基层医院完成日常各类业务&#xff0c;提供病患预约挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查询、医生工作站和护士工作站等一系列常规功能&#xff0c;还能与公卫…

中立分析腾讯云故障相关的事件

最近腾讯云的故障&#xff0c;让一堆云计算爱好者兴奋地远看指点江山、近看沐猴而冠。我比这群爱好者们更了解云计算&#xff0c;但是我尊重我的读者&#xff0c;你们从我这里看到的科普信息&#xff0c;不仅仅只有情绪价值。 在信息爆炸的时代&#xff0c;大家关注和信任某个媒…

OSPF:MGRE实验

一、拓扑图 二、实验内容 1&#xff0c;R6为ISP只能配置IP地址&#xff0c;R1-R5的环回为私有网段 2&#xff0c;R1/4/5为全连的MGRE结构&#xff0c;R1/2/3为星型的拓扑结构&#xff0c;R1为中心站点 3&#xff0c;所有私有网段可以互相通讯&#xff0c;私有网段使用OSPF完成 …

js-pytorch:开启前端+AI新世界

嗨&#xff0c; 大家好&#xff0c; 我是 徐小夕。最近在 github 上发现一款非常有意思的框架—— js-pytorch。它可以让前端轻松使用 javascript 来运行深度学习框架。作为一名资深前端技术玩家&#xff0c; 今天就和大家分享一下这款框架。 往期精彩 Nocode/Doc&#xff0c;可…

uni-app中页面生命周期与vue生命周期的执行顺序对比

应用生命周期 uni-app 支持如下应用生命周期函数&#xff1a; 函数名说明平台兼容onLaunch当uni-app 初始化完成时触发&#xff08;全局只触发一次&#xff09;&#xff0c;参数为应用启动参数&#xff0c;同 uni.getLaunchOptionsSync 的返回值onShow当 uni-app 启动&#x…

20240416,对象初始化和清理,对象模型和THIS指针

哈哈哈乌龟越狱了 目录 2.5 深拷贝&浅拷贝 2.6 初始化列表 2.7 类对象作为类成员 2.8 静态成员 2.9 成员变量和成员函数分开存储 2.10 THIS指针的用途 2.11 空指针访问成员函数 2.12 COSNT修饰成员函数 2.5 深拷贝&浅拷贝 浅拷贝&#xff1a;简单的赋值拷贝…

如何调整Hostease服务器cPanel中的域名数量限制

近段时间我们的网站总是受到攻击&#xff0c;为了保障网站的安全&#xff0c;我们准备将所有网站迁移至Hostease提供的高防服务器中。我们的服务器配置是Intel I3 - 2120&#xff0c;8GB 内存 1TB 机械硬盘&#xff0c;100M 带宽出口&#xff0c;外加10G 防御的防御&#xff0…

Day06 - React 第六天

学习react的第六天&#xff0c;持续更新中 关注不迷路&#xff01;&#xff01;&#xff01; 使用脚手架创建一个react项目 全局下载react脚手架 npm install -g create-react-app 在需要的项目文件中创建一个react项目 create-react-app #项目名 创建好项目以后 npm或yar…

Activity——spring方式创建activiti所需数据表结构

文章目录 前言依赖引入编写数据库连接等配置配置日志文件编写java代码生成数据库表结构问题反馈与解决思路问题一&#xff1a;Cause: java.sql.SQLSyntaxErrorException: Table activiti_02.act_ge_property doesnt exist 为什么文件名必须写死&#xff1f; 前言 在之前创建ac…

java绘图在ubuntu报错

把JRT网站部署到ubuntu桌面系统上&#xff0c;开始没测试绘图部分功能&#xff0c;只试了连PostGreSql部分正常。后面试了生成位图部分发现报错。 报下面错误&#xff1a; (ColorModel.java:220)\n\tat java.desktop/java.awt.image.BufferedImage.(BufferedImage.java:286)\n…

设计模式之状态模式(上)

状态模式 1&#xff09;概述 1.定义 允许一个对象在其内部状态改变时改变它的行为&#xff0c;对象看起来似乎修改了它的类。 2.作用 状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。 3.方案 状态模式将一个对象的状态从该对象中分离出来&…

RabbitMQ 各种通信模式的Python实现

一、RabbitMQ 原理 1、基本原理 RabbitMQ是流行的开源消息队列系统&#xff0c;用erlang语言开发。RabbitMQ是AMQP&#xff08;高级消息队列协议&#xff09;的标准实现。支持多种客户端&#xff0c;如&#xff1a;Python、Java、Javascript、C#、C/C,Go等&#xff0c;支持AJ…

【ENSP】华为三层交换机配置AAA认证,开启telnet服务

配置步骤 1.给交换机配置ip地址&#xff0c;以便登陆 2.配置AAA&#xff0c;用户名&#xff0c;密码&#xff0c;服务类型&#xff0c;用户权限 3.配置接入设备的数量 4.开启telnet服务 LSW2交换机配置 u t m #关闭提示 sys …