当前位置:首页 > 技术分析 > 正文内容

.Net6基础功能封装分享7(ORM框架Sqlsugar集成)

ruisui884个月前 (02-03)技术分析31

在.netcore中有很多优秀的ORM开源框架,我选择了集成Sqlsugar,Sqlsugar的优点很多,我就不在这里详述了,最让我中意的还是Sqlsugar在文档方面我觉得是做的最好的,必须给作者点赞。

首先当然还是下载SqlSugarCore依赖包啦

然后编写数据源配置对象和在配置文件中增加配置

编写增加sqlSugar的扩展方法(获取配置源、创建创建sqlclient对象、增加sql语句执行日志拦截器、sql异常拦截器、插入和更新拦截器、将SqlSugarClient对象以单例模式注入到IServiceCollection容器中、启动连接验证等)

public static IServiceCollection AddDataSource(this IServiceCollection services, IConfiguration configuration)
{
    //获取数据源配置
    DataSourceConfig dataSource = configuration.GetT();
    DbContext.SetDataSourceConfig(dataSource);
    if (dataSource == null)
    {
        NLogger.Default.Error("获取数据库连接配置错误");
        return services;
    }
    DbType dbType = (DbType)Enum.Parse(typeof(DbType), dataSource.DbType);
    //创建SqlSugarClient对象
    SqlSugarScope sqlSugar = new SqlSugarScope(new ConnectionConfig()
    {
        ConfigId= "default",
        DbType = dbType,
        IsAutoCloseConnection = true,
        ConnectionString = dataSource.ConnectionString,
    },
     db =>
     {
        //增加sql语句执行日志
         db.Aop.OnLogExecuting = (sqlStr, pms) =>
         {
             if (dataSource.IsPrintSqlLog)
             {
                 NLogger.Default.Info($"执行sql语句:{UtilMethods.GetNativeSql(sqlStr, pms)}");
             }
         };
         //异常
         db.Aop.OnError = (ex) =>
         {
             NLogger.Default.Error("==============执行sql错误==============");
             if (ex.Parametres == null)
             {
                 NLogger.Default.Error(ex.Sql);
             }
             else
             {
                 SugarParameter[] param = ex.Parametres as SugarParameter[];
                 NLogger.Default.Error(UtilMethods.GetNativeSql(ex.Sql, param));
             }
         };
         //插入和更新过滤器
         db.Aop.DataExecuting = (oldValue, entityInfo) =>
         {
             // 新增操作
             if (entityInfo.OperationType == DataFilterType.InsertByObject)
             {
                 // 主键(long类型)且没有值的---赋值雪花Id
                 if (entityInfo.EntityColumnInfo.IsPrimarykey && entityInfo.EntityColumnInfo.PropertyInfo.PropertyType == typeof(long))
                 {
                     var id = entityInfo.EntityColumnInfo.PropertyInfo.GetValue(entityInfo.EntityValue);
                     if (id == null || (long)id == 0)
                     {
                         entityInfo.SetValue(CommonUtils.GetSingleId());
                     }
                 }
                 if (entityInfo.PropertyName == nameof(BaseEntity.CreateTime))
                 {
                     entityInfo.SetValue(DateTime.Now);
                 }
                 //if (App.User != null)
                 //{
                 //    //创建人和创建机构ID
                 //    if (entityInfo.PropertyName == nameof(BaseEntity.CreateUserId))
                 //    {
                 //        entityInfo.SetValue(App.User.FindFirst(ClaimConst.UserId)?.Value);
                 //    }
                 //    if (entityInfo.PropertyName == nameof(BaseEntity.CreateUser))
                 //    {
                 //        entityInfo.SetValue(App.User?.FindFirst(ClaimConst.Account)?.Value);
                 //    }
                 //    if (entityInfo.PropertyName == nameof(DataEntityBase.CreateOrgId))
                 //    {
                 //        entityInfo.SetValue(App.User.FindFirst(ClaimConst.OrgId)?.Value);
                 //    }
                 //}
             }
             // 更新操作
             if (entityInfo.OperationType == DataFilterType.UpdateByObject)
             {
                 //更新时间
                 if (entityInfo.PropertyName == nameof(BaseEntity.UpdateTime))
                 {
                     entityInfo.SetValue(DateTime.Now);
                 }
                 //更新人
                 //if (App.User != null)
                 //{
                 //    if (entityInfo.PropertyName == nameof(BaseEntity.UpdateUserId))
                 //    {
                 //        entityInfo.SetValue(App.User?.FindFirst(ClaimConst.UserId)?.Value);
                 //    }
                 //    if (entityInfo.PropertyName == nameof(BaseEntity.UpdateUser))
                 //    {
                 //        entityInfo.SetValue(App.User?.FindFirst(ClaimConst.Account)?.Value);
                 //    }
                 //}

             }
         };
     });
    services.AddSingleton(sqlSugar);//这边是SqlSugarScope用AddSingleton
    DbContext.SetClient(sqlSugar);
    Task.Run(() =>
    {
        bool success = sqlSugar.Ado.IsValidConnection();
        if (success)
        {
            NLogger.Default.Info("[数据库连接测试]:数据库连接成功");
        }
        else
        {
            NLogger.Default.Error("[数据库连接测试]:数据库连接失败");
        }
    });
    return services;
}

在Program启动类中,执行增加数据源的扩展方法

为了业务中操作方便和符合自己的使用习惯,使用了仓储模式,编写仓储类,继承SimpleClient,可以自己增加共用的仓储扩展方法

在业务的数据访问层中创建dao对象,继承仓储类,就能使用sqlSugar中提供的方法,操作数据库表了,在Dao类中也有三种方式使用ISqlSugarClient对象

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/1331.html

分享给朋友:

“.Net6基础功能封装分享7(ORM框架Sqlsugar集成)” 的相关文章

「Git迁移」三行命令迁移Git包含提交历史,分支,tag标签等信息

问题描述:公司需要将一个git远程服务器的全部已有项目迁移到一台新服务器的Gitlab中,其中需要包含全部的提交纪录,已有的全部分支与全部打tag标签,目前此工作已全部迁移完毕,特此记录一下操作步骤环境描述:1. 要迁移的远程Git:Gitblit2. 迁移目的Git:Gitlab3. 暂存代码的P...

K8S NFS 共享存储

NFS 共享存储前面我们学习了 hostPath 与 Local PV 两种本地存储方式,但是平时我们的应用更多的是无状态服务,可能会同时发布在不同的节点上,这个时候本地存储就不适用了,往往就需要使用到共享存储了,比如最简单常用的网络共享存储 NFS,本节课我们就来介绍下如何在 Kubernetes...

Vue页面传参详解

一、两种方式方法1:name跳转页面this.$router.push({name:'anotherPage',params:{id:1}})另一页面接收参数方式:this.$route.params.id示例:控制台展示:方法2:path跳转页面this.$router.push(...

VUE-router

七.Vue-router1、什么是vue-routervue-router是vue.js官方路由管理器。vue的单页应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。传统页面切换是用超链接a标签进行切换。但vue里是用路由,因为我们用Vue做的都是单页应用,就相当于只有一个主的i...

慕课 SpringBoot2.X+Vue+UniAPP,全栈开发医疗小程序

本课程以业务驱动技术栈,打造业务相对完整的掌上医疗小程序,解决大家没有好的毕设项目或者求职项目的困境。本课程案例采用前后端分离架构,业务功能完善(既有WEB管理端,也有移动用户端),界面美观,无需艰涩的技术也能做出亮眼的作品。SpringBoot2.X+Vue+UniAPP,全栈开发医疗小程序 |...

每日分享- Vue 3.0 + vite + axios 出现跨域问题如何解决

在 Vue 3.0 + Vite + Axios 中,如果接口请求的地址与前端代码不在同一域下,就会出现跨域问题。这种情况下,可以采取以下几种简单的解决办法:一 使用代理在 Vite 的配置文件中,可以通过 proxy 选项来配置代理,使得前端代码与接口请求在同一域下。例如:// vite.conf...