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方法完成注册:
SqlServer
using System.Data.SqlClient;
DbProviderFactories.RegisterFactory(“System.Data.SqlClient”,SqlClientFactory.Instance);
MySql
using MySql.Data.MySqlClient;
DbProviderFactroes.RegisterFactory(“MySql.Data.MySqlClient”,MySqlClientFactory.Instance);
PostgreSql
using Npgsql;
DbProviderFactories.RegisterFactory(“Npgsql”,NpgsqlFactory.Instance);
SqlLite
using Microsoft.Data.Sqlite;
DbProviderFactories.RegisterFactory(“Microsoft.Data.Sqlite”,SqliteFactory.Instance);
使用
DbProviderFactory factory = DbProviderFactories.GetFactory(“MySql.Data.MySqlClient”);
//创建一个数据客户端连接
DbConnection conn = factory.CreateConnection();
升级
在上述方法过程中是使用的直接注册工厂单例完成的;
按照官方的API 可以使用注册指定的工厂类型和应用程序集来完成
public static void RegisterFactory(string providerInvarintName,string factoryTypeAssemblyQualifiedName);
例如mysql
DbProviderFactories.RegisterFactory(providerName, “MySql.Data.MySqlClient.MySqlClientFactory,MySql.Data”);
前面是工厂的类型名称,后面是类所在的应用程序集,即可达到同样的效果;
这样的好处就是自己在封装数据库方法的时候不需要再将mysql,sqlserver的包一起打入到框架中,而是交由使用的web或者desktop项目来加载数据库客户端包,用法就可以像 .netframework项目一样的使用了。