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)就可以了。
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專案一樣的使用了