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

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

ruisui883个月前 (02-03)技术分析15

在.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集成)” 的相关文章

Excel VBA 收费结算模块/一步一步带你设计【收费管理系统】11

本文于2023年6月9日首发于本人同名公众号:Excel活学活用,更多文章案例请搜索关注!☆本期内容概要☆用户窗体设置:收费结算模块设置(6)增加合计金额增加收款方式选择输入大家好,我是冷水泡茶,前几期我们分享了【收费管理系统】的设计,最近一期是(Excel VBA 收费结算模块/一步一步带你设计【...

Vue3 中有哪些值得深究的知识点?

众所周知,前端技术一直更新很快,这不 vue3 也问世这么久了,今天就来给大家分享下vue3中值得注意的知识点。喜欢的话建议收藏,点个关注!1、createAppvue2 和 vue3 在创建实例时,有很大的区别,具体对比如下://Vue 2 Vue.use({ router, store,...

Git分布式系统---Gitlab多人工作流程

前言在上一次推文中,我们已经很清楚的讲解了如何创建本地仓库、提交(push)项目到远程仓库以及从远程仓库clone(克隆)项目到本地的相关操作。大家可以先去看前面的推文(快速掌握Git分布式系统操作)点击查看目前无论你是否步入社会还是在校学生,都会使用Gitlab来进行团队的代码管理。(可以这样说:...

java调用API操作GitLab

最近需要在一个WEB项目中集成GitLab,用到了GitLab的API操作,在网上找了很久都是说直接调用GitLab的Http接口,而且API官方只有javadoc没有其它说明文档,特别记录下,以备查询。这里采用Token的认证方式,因此需要先登陆GitLab新建一个Token,创建方式如下:创建完...

jvm疯狂吃内存,到底是谁的锅?

jvm应该是每一个java程序员都需要掌握的内容,但是在没有遇到问题之前,很多都是基于理论的,唯有实战才能增加个人的知识储备。本文是从一个角度来分析是谁在狂吃内存,希望对你有所帮助。本文是易观技术人员注意到一台开发机上各个微服务进程占用内存很高,随即便展开了调查......ps:本文来源于:http...

Firefox正针对Vue.js进行优化,下版本响应速度将“显著提升”

IT之家 9 月 7 日消息,据 Mozilla 官方博客发文显示,Firefox 浏览器正针对 Vue.js 进行优化,此前 FireFox 浏览器在面向 Vue 3 时遇到了一些性能问题。▲ 图源 Mozilla 官方博客目前开发人员已经对此进行了解决,在 Firefox 118 内部版本中进行...