asp.netcore3.0 netstandard2.1 使用 DbProviderFactories 连接数据库
在.netstandard2.0时 System.Data.Common 这个包里并没有加入DbProviderFactories
DbProviderFactories类在.netframework中是非常重要的存在,依靠他可以适配各种数据库客户端(sqlserver、mysql、sqllite等)创建数据库连接。
现在 随着.netcore3.0的正式发布,已经实现了.netstandard2.1,并且在此版本中实现了 DbProviderFactories
现在可以像.netframework中一样愉快的使用
DbProviderFactory factory = DbProviderFactories.GetFactory("MySql.Data.MySqlClient");
但是如果直接这么写代码的话就会报错
System.ArgumentException:“The specified invariant name 'MySql.Data.MySqlClient' wasn't found in the list of registered .NET Data Providers.”
NET Core的数据库连接与.NET Framework略有不同。在.NET Framework中,程序可用的数据库驱动程序在整个系统范围内(通过machine.config)自动可用。也就是 mysql的.net连接驱动(mysql-connector-net-x.x.x.x.msi)就可以了。
而.NET Core中不是这种情况,您必须注册要使用的数据库驱动程序-通常在Program.cs
或中Startup.cs
。使用 以下DbProviderFactories.RegisterFactory方法完成注册:
SQL服务器
using System.Data.SqlClient;
DbProviderFactories.RegisterFactory("System.Data.SqlClient", SqlClientFactory.Instance);
MySQL的
using MySql.Data.MySqlClient;
DbProviderFactories.RegisterFactory("MySql.Data.MySqlClient", MySqlClientFactory.Instance);
PostgreSQL的
using Npgsql;
DbProviderFactories.RegisterFactory("Npgsql", NpgsqlFactory.Instance);
SQLite的
using Microsoft.Data.Sqlite;
DbProviderFactories.RegisterFactory("Microsoft.Data.Sqlite", SqliteFactory.Instance);
这些数据库访问工厂的单例都是继承DbProviderFactory,需要通过nuget安装对应的数据库客户端包例如 Mysql.Data
在这之后就是在需要的地方使用
DbProviderFactory factory = DbProviderFactories.GetFactory("MySql.Data.MySqlClient");
//创建一个数据客户端连接
DbConnection conn = factory.CreateConnection();
升级
在上述方法过程中是使用的直接注册工厂单例完成的;
按照官方的API 可以使用注册指定的工厂类型和应用程序集来完成
//
// 参数:
// providerInvariantName:
//
// factoryTypeAssemblyQualifiedName:
public static void RegisterFactory(string providerInvariantName, string factoryTypeAssemblyQualifiedName);
例如mysql
DbProviderFactories.RegisterFactory(providerName, "MySql.Data.MySqlClient.MySqlClientFactory,MySql.Data");
前面是工厂的类型名称,后面是类所在的应用程序集,即可达到同样的效果;
这样的好处就是自己在封装数据库方法的时候不需要再将mysql,sqlserver的包一起打入到框架中,而是交由使用的web或者desktop项目来加载数据库客户端包,用法就可以像 .netframework项目一样的使用了。
最新文章
- AngularJS之中级Route【二】(七)
- Struts2 OGNL案例
- ThreadLocal实现方式&;使用介绍—无锁化线程封闭
- 【使用Unity开发Windows Phone上的2D游戏】(2)初识工具
- 使用freemarker生成word,步骤详解并奉上源代码
- js截取所需字符串长度
- Nginx完整配置说明
- python Day 2 - 编写数据库模块
- [Design Pattern] Factory Pattern 简单案例
- apicloud ios 打包流程
- [笔记]FTRL与Online Optimization
- python paramiko模块 用密钥传输
- 用Python最原始的函数模拟eval函数的浮点数运算功能
- jQuery事件绑定,解绑,触发
- Hive数据倾斜解决方案
- Windows server 2012 卸载iis 黑屏
- vue跨域解决方法
- Ubuntu 16.04 LTS 安装Mongodb 3.4
- 为什么说 HashMap 是非线程安全的?
- WPF实战案例-MVVM模式下在Xaml中弹出窗体
热门文章
- input样式重置(outline:none)
- Git安装与使用(windows环境)(一)----Git安装、生成公钥和私钥、添加SSH
- MYSQL批量导入数据报:[Err] 2006 - MySQL server has gone away 解决方法
- Unity之SDK接入(Unity与Android通信)
- CocosBuilder 学习笔记(2) .ccbi 文件结构分析
- CAD数据分块,偏移校准,加载到百度地图、高德地图、谷歌等地图上
- tensorflow学习笔记——自编码器及多层感知器
- 不修改的主席(HJT)树-HDU2665,POJ-2104;
- codeforces 764 C. Timofey and a tree(dfs+思维)
- 接口压测工具WRK的学习与使用