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

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.mfbz.cn/a/559065.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

便携式HD-SDI模拟源测试设备

便携式HD-SDI模拟源测试设备 平台简介 便携式手提CameraLink模拟源测试设备&#xff0c;以PCIe的HD-SDI播出卡和X86主板为基础&#xff0c;构建便携式的手提设备。 平台默认操作系统为win7 64位系统&#xff1b;具备丰富的外设接口&#xff0c;如VGA、HDMI、千兆网口、USB2.0/3…

ADOP 万兆电口光模块:SFP+转RJ45端口解决方案

&#x1f335;在数据中心的接入层中&#xff0c;大多数服务器网卡&#xff08;NIC&#xff09;和存储设备都采用10GBASE-T RJ45端口&#xff0c;而与之相连的TOR&#xff08;机架顶部&#xff09;交换机通常配备SFP端口&#xff0c;且二者无法直接相连。为了解决该问题&#xf…

[大模型]Qwen-7B-hat Transformers 部署调用

Qwen-7B-hat Transformers 部署调用 环境准备 在autodl平台中租一个3090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打开刚刚租用服务器的JupyterLab&#xff0c;并且打开其中的终端开始环境配置、模型下…

AI大模型探索之路-应用篇17:GLM大模型-大数据自助查询平台架构实践

文章目录 前言一、技术架构设计二、本地知识库准备三、SQLServer服务1. 数据库准备步骤1&#xff1a;安装MySQL数据库步骤2&#xff1a;启动MySQL数据库步骤3&#xff1a;登录MySQL数据库步骤4&#xff1a;创建数据库用户glm步骤5&#xff1a;给数据库用户赋权限步骤6&#xff…

分布式锁(Redis)

一、序言 本文和大家聊聊分布式锁以及常见的解决方案。 二、什么是分布式锁 假设一个场景&#xff1a;一个库存服务部署在上面三台机器上&#xff0c;数据库里有 100 件库存&#xff0c;现有 300 个客户同时下单。并且这 300 个客户均摊到上面的三台机器上&#xff08;即三台…

AI绘画 究竟在哪些方面降低了门槛

AI绘画的产物是图像。图像对人类的认知、情感和文化发展起着重要的作用&#xff0c;包括信息传递、创造性表达、历史记录、审美享受和交流。 从原来的纸笔调色板到数字时代的数字板、绘图软件&#xff0c;再到AI绘画时代&#xff0c;任何人都可以用几行简单的文字创作出高质量…

在PostgreSQL中如何创建和使用自定义函数,包括内置语言(如PL/pgSQL)和外部语言(如Python、C等)?

文章目录 一、使用内置语言 PL/pgSQL 创建自定义函数示例代码使用方法 二、使用外部语言 Python 创建自定义函数安装 PL/Python 扩展示例代码使用方法 三、使用外部语言 C 创建自定义函数编写 C 代码编译为共享库在 PostgreSQL 中注册函数注意事项 总结 PostgreSQL 是一个强大的…

【Java开发指南 | 第十七篇】Java 方法

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 简介语法实例构造方法 简介 Java中的方法是用来执行特定任务的一组语句&#xff0c;可以重复使用。它们包含在类或对象中&#xff0c;并通过调用来执行。 举个例子&#xff0c;println() 是一个方法&#xff…

论文阅读:BEVBert: Multimodal Map Pre-training for Language-guided Navigation

BEVBert&#xff1a;语言引导导航的多模态地图预训练 摘要 现存的问题&#xff1a;目前大多数现有的预训练方法都采用离散的全景图来学习视觉-文本关联。这要求模型隐式关联全景图中不完整、重复的观察结果&#xff0c;这可能会损害智能体的空间理解。 本文解决方案&#xf…

Android开发:应用百度智能云中的身份证识别OCR实现获取个人信息的功能

百度智能云&#xff1a; 百度智能云是百度提供的公有云平台&#xff0c;于2015年正式开放运营。该平台秉承“用科技力量推动社会创新”的愿景&#xff0c;致力于将百度在云计算、大数据、人工智能的技术能力向社会输出。 百度智能云为金融、城市、医疗、客服与营销、能源、制造…

【漏洞复现】泛微e-cology ProcessOverRequestByXml接口存在任意文件读取漏洞

漏洞描述 泛微e-cology依托全新的设计理念,全新的管理思想。 为中大型组织创建全新的高效协同办公环境。 智能语音办公,简化软件操作界面。 身份认证、电子签名、电子签章、数据存证让合同全程数字化。泛微e-cology ProcessOverRequestByXml接口存在任意文件读取漏洞 免责声…

怎么看自己是不是公网IP?

当我们需要进行网络连接或者网络配置的时候&#xff0c;经常会遇到需要知道自己是否拥有公网IP的情况。公网IP是全球唯一的IP地址&#xff0c;在互联网上可直接访问和被访问&#xff0c;而私有IP则是在本地网络中使用&#xff0c;无法从互联网上直接访问。我们将介绍如何查看自…

Java - 阿里巴巴命名规范

文章目录 前言一、编程规约(一) 命名风格(二) 常量定义(三) 代码格式(四) OOP 规约(五) 日期时间(六) 集合处理(七) 并发处理(八) 控制语句(九) 注释规约(十) 前后端规约(十一) 其他 二、异常日志(一) 错误码(二) 异常处理(三) 日志规约 三、单元测试四、安全规约五、MySQL 数据…

C# winform s7.net expected 22 bytes.”

S7.Net.PlcException:“Received 12 bytes: 32-02-00-00-00-00-00-00-00-00-81-04, expected 22 bytes.” 原因是博图的连接机制未勾选

【Java框架】Spring框架(二)——Spring基本核心(AOP)

目录 面向切面编程AOPAOP的目标&#xff1a;让我们可以“专心做事”专心做事专心做事解决方案1.0专心做事解决方案2.0蓝图 AOP应用场景AOP原理AOP相关术语术语理解 AOP案例实现前置/后置/异常/最终增强的配置实现1.依赖2.业务类3.日志类4.配置切入点表达式匹配规则举例 环绕增强…

Spring AOP (二)

本篇将介绍Spring AOP的相关原理。 一、代理模式 Spring 在实现AOP时使用了代理模式这种设计模式&#xff0c;什么是代理模式呢我们来了解一下。 代理模式可以理解为当我们需要调用某个类的方法时&#xff0c;在我们与这个目标类之间增加一个代理类&#xff0c;我们要使用目标…

vue2响应式 VS vue3响应式

Vue2响应式 存在问题&#xff1a; 新增属性&#xff0c;删除属性&#xff0c;界面不会更新。 直接通过下标修改数组界面不会自动更新。 Vue2使用object.defineProperty来劫持数据是否发生改变&#xff0c;如下&#xff1a; 能监测到获取和修改属性&#xff1a; 新增的属性…

【C++打怪之路】-- C++开篇

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;C打怪之路&#xff0c;python从入门到精通&#xff0c;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &…

【C语言】深入解析选择排序算法

一、算法原理二、算法性能分析三、C语言实现示例四、总结 一、算法原理 选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法。它的工作原理是不断地选择剩余元素中的最小&#xff08;或最大&#xff09;元素&#xff0c;放到已排序的序列的末尾&#xff…

securecrt 批量登录服务器介绍

一、前言 在有一些IT环境中&#xff0c;可能存在各种情况的服务器&#xff0c;因为各种原因不能统一部署类似ansible、saltstack等批量操控软件&#xff0c;当遇到需要对这些服务器进行某项信息的排查或调整配置时&#xff0c;你是否还是通过securecrt一台一台登录后进行操作&a…
最新文章