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

发布于:2024-04-20 ⋅ 阅读:(29) ⋅ 点赞:(0)

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。