基于SqlSugar的数据库访问处理的封装,支持.net FrameWork和.net core的项目调用

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 基于SqlSugar的数据库访问处理的封装,支持.net FrameWork和.net core的项目调用

由于我们有时候需要在基于.net framework的项目上使用(如Winform端应用),有时候有需要在.net core的项目上使用(如.net core的WebAPI),那么我们把基于SQLSugar的基础模块封装,编译为.net standard就很有必要,而且由于.net framework和.net core在配置文件上的差异,我们需要对基础配置信息进行不同环境的兼容处理,以便实现基础模块支持.net FrameWork和.net core的项目调用。

1、基于.netStandard的类库模块

在上篇随笔《基于SqlSugar的数据库访问处理的封装,支持多数据库并使之适应于实际业务开发中(1)》中介绍了对SqlSugar 基础模块的封装处理,为了兼容不同类型的框架,我们可以把它们封装为.net Standard类库。

但是 为了基础模块能够顺利加载不同.net框架下的配置文件信息来初始化数据库连接,我们需要配置不同的加载处理方式来读取处理。

如.net Framework的使用App.config中读取配置信息,而.net core项目中使用读取 appSettings.json里面的配置信息。

因此需要让它们兼容,我们需要修改项目文件中的TargetFrameworks,让它根据不同的框架生成不同的DLL类库,从而达到支持不同环境下配置文件的读取处理。

这样我们查看项目属性,就可以看到类库是支持多种目标框架的了。

接下来我们对DbContext辅助类进行改动,让它根据不同的目标框架条件来读取配置信息。

统一入口就是调用ConfigHelper辅助类来隔离处理操作。

public DbContext()
        {
            this.DbSetting = ConfigHelper.GetDbSettings();
            Init(this.DbSetting.DbConfigName);
        }
        public DbContext(string dbConfigName)
        {
            if (this.DbSetting == null)
            {
                this.DbSetting = ConfigHelper.GetDbSettings();
            }
            Init(dbConfigName);
        }

以替代原先的处理代码。原先的只能从.net framework的App.config中读取,现在我们需要根据框架来判断处理。

public DbContext()
        {
            //默认采用配置项名
            //appSettings/DefaultDb 配置项为指定连接字符串的name
            var dbConfigName = ConfigurationManager.AppSettings["DefaultDb"];
            Init(dbConfigName);
        }

我们先来定义一个承载数据库信息的实体类对象。

/// <summary>
    /// 数据库配置信息
    /// </summary>
    public class DbSetting
    {
        /// <summary>
        /// 默认指定的连接字符串集合的配置项名称
        /// </summary>
        public string DbConfigName { get; set; }
        /// <summary>
        /// 数据库类型,默认为SQLServer
        /// </summary>
        public string DbType { get; set; } = "sqlserver";
        /// <summary>
        /// 连接字符串
        /// </summary>
        public string ConnectionString { get; set; }
    }

在目标框架为.net framwork的时候,我们的App.Config配置信息是下面的。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <!--Sqlserver数据库的连接字符串-->
    <add name="sqlserver" providerName="System.Data.SqlClient" connectionString="Persist Security Info=False;Data Source=(local);Initial Catalog=WinFramework;Integrated Security=SSPI" />
    <!--MySQL数据库的连接字符串-->
    <add name="mysql" providerName="MySql.Data.MySqlClient" connectionString="Server=localhost;Database=winframework;Uid=root;Pwd=123456;SslMode=none" />
    <!--sqlite数据库字符串,路径符号|DataDirectory|代表当前运行目录-->
    <add name="sqlite" providerName="System.Data.SQLite" connectionString="Data Source=|DataDirectory|\WinFramework.db;Version=3;" />
    <!--PostgreSQL数据库的连接字符串-->
    <add name="npgsql" providerName="Npgsql" connectionString="Server=localhost;Port=5432;Database=winframework;User Id=postgres;Password=123456" />
    <!--不受驱动影响,32位64位均可使用-->
    <add name="oracle" providerName="OracleManaged" connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));User ID=win;Password=win" />
    <!--达梦数据库的连接字符串-->
    <add name="Dm" providerName="Dm" connectionString="Server=localhost;User ID=SYSDBA;PWD=SYSDBA;Database=WINFRAMEWORK;" />
  </connectionStrings>
  
  <appSettings>
    <!--指定默认的数据库类型,如果不指定则使用第一个连接字符串-->
    <add key="DefaultDb" value="sqlserver" />
    <!--字典、权限组件的数据库类型:mysql、npgsql、oracle、sqlite、sqlserver等,默认为sqlserver可不写-->
    <add key="ComponentDbType" value="sqlserver" />
  </appSettings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
  </startup>

而如果是基于.net core的情况下,读取的是appSettings.json里面的配置信息,配置文件信息如下所示。

{
  "ConnectionStrings": {
    "Default": "Server=.; Database=WeixinBootstrap2; Trusted_Connection=True;",
    "Oracle": "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));User ID=C##ABP;Password=abp",
    "MySql": "Server=localhost;Database=myprojectdb;Uid=root;Pwd=123456;",
    "PostgreSQL": "Server=localhost;Port=5432;Database=myprojectdb;User Id=postgres;Password=123456"
  },
  "DbSetting": {
    "DefaultDb": "Default",
    "ComponentDbType": "sqlserver"
  },
   ...........   
  }

其中 DefaultDb 指向的是默认的连接字符串配置节点名称,而ComponentDbType为它的数据库类型,如sqlserver,mysql这样的标识。

 

2、根据不同目标框架读取配置信息

有了上面不同目标框架下的配置信息节点的格式,我们就可以根据目标框架的不同来相应读取配置信息,从而实现不同的初始化处理操作。

/// <summary>
        /// 根据承载环境是netframework或者是.netcore,读取配置信息。
        /// 在.netframework中的app.config的appSettings中配置DefaultDb,ComponentDbType,连接字符串在connectionStrings中配置
        /// 在.netcore中的appSettings.json的DbSetting节点中配置DefaultDb,ComponentDbType,连接字符串在ConnectionStrings中配置
        /// </summary>
        /// <returns></returns>
        public static DbSetting GetDbSettings()
        {
            //初始化承载配置信息对象
            var dbSetting = new DbSetting();
#if NETFRAMEWORK
            //基于.net frameowork下读取app.config的配置
            dbSetting.DbType = ConfigurationManager.AppSettings["ComponentDbType"] ?? "sqlserver";
            dbSetting.DbConfigName = ConfigurationManager.AppSettings["DefaultDb"];
            var setting = ConfigurationManager.ConnectionStrings[1];//默认第一个连接字符串
            if (!string.IsNullOrWhiteSpace(dbSetting.DbConfigName))
            {
                //如果配置节点名称存在,则读取它的连接字符串
                setting = ConfigurationManager.ConnectionStrings[dbSetting.DbConfigName];
            }
            if (setting != null)
            {
                dbSetting.ConnectionString = setting.ConnectionString;
            }
#else
            //基于.net core下的读取appsettings.json的配置信息
            dbSetting.DbType = GetSectionValue("DbSetting:ComponentDbType") ?? "sqlserver";
            dbSetting.DbConfigName = GetSectionValue("DbSetting:DefaultDb");
            
            var connectionStringKey = string.Format("ConnectionStrings:{0}", dbSetting.DbConfigName);
            dbSetting.ConnectionString = GetSectionValue(connectionStringKey);
#endif
            return dbSetting;
        }

我们可以从类的顶部来选择对应的分类,从而实现代码的加亮显示,便于代码的编写。

另外,我们根据配置信息的数据库类型,通过遍历判断的方式来转换为SqlSugar对应的数据库类型即可。

这样DbContext初始化的时候,就能够顺利适用于不同的目标框架中了,我们在SQLSugar封装的基类就可以不管它的具体处理,只需要初始化DbContext即可,如下代码所示。

基类调用来处理常规的对象返回操作,代码如下所示。

/// <summary>
        /// 获取所有记录
        /// </summary>
        public virtual async Task<ListResultDto<TEntity>> GetAllAsync()
        {
            var list = await EntityDb.GetListAsync();
            return new ListResultDto<TEntity>()
            {
                Items = list
            };
        }

而如果我们需要联合多表来实现联合查询,也可以使用基类的对象进行处理。

如对于字典来说,根据字典大类名称来获取字典项目信息,而字典项目表里面,只有字典大类的ID,那么就需要联合字典大类和字典项目两个表进行关联查询了,如下代码所示。

/// <summary>
        /// 根据字典类型名称获取所有该类型的字典列表集合(Key为名称,Value为值)
        /// </summary>
        /// <param name="dictTypeName">字典类型名称</param>
        /// <returns></returns>
        public async Task<Dictionary<string, string>> GetDictByDictType(string dictTypeName)
        {
            var query = this.dbContent.Client.Queryable<DictDataInfo, DictTypeInfo>(
                (d, t) => d.DictType_ID == t.Id && t.Name == dictTypeName)
                .Select(d => d); //联合条件获取对象
            query = query.OrderBy(d => d.DictType_ID).OrderBy(d => d.Seq);//排序
            var list = await query.ToListAsync();//获取列表
            var dict = new Dictionary<string, string>();
            foreach (var info in list)
            {
                if (!dict.ContainsKey(info.Name))
                {
                    dict.Add(info.Name, info.Value);
                }
            }
            return dict;
        }

这样就可以实现联合表的查询处理。

至此,我们就可以无差别的在不同的目标框架上,根据不同的配置文件来初始化我们的DbContext类,从而无差别的使用基于SqlSugar的数据库访问处理的基类,简化了框架的处理。

 

相关随笔列表如下所示。

基于SqlSugar的数据库访问处理的封装,支持.net FrameWork和.net core的项目调用 (本篇随笔)

 

基于SqlSugar的数据库访问处理的封装,支持多数据库并使之适应于实际业务开发中(2)

 

基于SqlSugar的数据库访问处理的封装,支持多数据库并使之适应于实际业务开发中  

 

专注于代码生成工具、.Net/.NetCore 框架架构及软件开发,以及各种Vue.js的前端技术应用。著有Winform开发框架/混合式开发框架、微信开发框架、Bootstrap开发框架、ABP开发框架、SqlSugar开发框架等框架产品。
 转载请注明出处:撰写人:伍华聪  http://www.iqidi.com

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
25天前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
|
28天前
|
Java 物联网 编译器
C#一分钟浅谈:.NET Core 与 .NET 5 区别
本文对比了 .NET Core 和 .NET 5,从历史背景、主要区别、常见问题及易错点等方面进行了详细分析。.NET Core 侧重跨平台支持和高性能,而 .NET 5 在此基础上统一了 .NET 生态系统,增加了更多新特性和优化。开发者可根据具体需求选择合适的版本。
45 7
|
25天前
|
人工智能 开发框架 前端开发
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
|
25天前
|
开发框架 网络协议 .NET
C#/.NET/.NET Core优秀项目和框架2024年10月简报
C#/.NET/.NET Core优秀项目和框架2024年10月简报
|
2月前
|
开发框架 缓存 监控
NET Framework 到 .NET 5/6 的迁移是重大的升级
本文详细介绍了从 .NET Framework 4.8 迁移到 .NET 5/6 的过程,通过具体案例分析了迁移策略与最佳实践,包括技术栈评估、代码迁移、依赖项更新及数据库访问层的调整,强调了分阶段迁移、保持代码可维护性及性能监控的重要性。
58 3
|
24天前
|
人工智能 开发框架 安全
C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)
C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)
|
2月前
|
SQL XML 关系型数据库
入门指南:利用NHibernate简化.NET应用程序的数据访问
【10月更文挑战第13天】NHibernate是一个面向.NET的开源对象关系映射(ORM)工具,它提供了从数据库表到应用程序中的对象之间的映射。通过使用NHibernate,开发者可以专注于业务逻辑和领域模型的设计,而无需直接编写复杂的SQL语句来处理数据持久化问题。NHibernate支持多种数据库,并且具有高度的灵活性和可扩展性。
43 2
|
2月前
|
人工智能 开发框架 Cloud Native
C#/.NET/.NET Core技术前沿周刊 | 第 9 期(2024年10.07-10.13)
C#/.NET/.NET Core技术前沿周刊 | 第 9 期(2024年10.07-10.13)
|
2月前
|
开发框架 前端开发 API
C#/.NET/.NET Core优秀项目和框架2024年9月简报
C#/.NET/.NET Core优秀项目和框架2024年9月简报
|
2月前
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合