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