• asp.netcore3.0 netstandard2.1 使用 DbProviderFactories 连接数据库


    在.netstandard2.0时 System.Data.Common 这个包里并没有加入DbProviderFactories
    DbProviderFactories类在.netframework中是非常重要的存在,依靠他可以适配各种数据库客户端(sqlserver、mysql、sqllite等)创建数据库连接。
    现在 随着.netcore3.0的正式发布,已经实现了.netstandard2.1,并且在此版本中实现了 DbProviderFactories
    image.png

    现在可以像.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项目一样的使用了。

  • 相关阅读:
    Linux进程状态——top,ps中看到进程状态D,S,Z的含义
    openstack-neutron基本的网络类型以及分析
    openstack octavia的实现与分析(二)·原理,架构与基本流程
    网络虚拟化基础协议·Geneve
    openstack octavia的实现与分析(一)·openstack负载均衡的现状与发展以及lvs,Nginx,Haproxy三种负载均衡机制的基本架构和对比
    Linux下多网卡绑定bond及模式介绍
    Python调试器-pdb的使用
    DELL R720服务器安装Windows Server 2008 R2 操作系统图文详解
    JAVA WEB实现前端加密后台解密
    JAVA实现AES和MD5加密
  • 原文地址:https://www.cnblogs.com/sands/p/11594927.html
Copyright © 2020-2023  润新知