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項目一樣的使用了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM