DbProviderFactories.GetFactoryClasses returns 在 .NET Core 2.1 中安装 .NET SQL 客户端后没有结果
DbProviderFactories.GetFactoryClasses returns no results after installing .NET SQL Client in .NET Core 2.1
我正在将一个库移植到 .NET Core 2.1,因为它支持 DbProviderFactory。在大多数情况下它运行良好 - 它可以编译,但是当 运行 我得到一个错误:
System.ArgumentException: 'The specified invariant name 'System.Data.SqlClient' wasn't found in the list of registered .NET Data Providers.'
我已经使用 DbProviderFactories.GetFactoryClasses()
检查是否安装了任何提供程序,但似乎没有(结果 table 中的 0 行)。
所以我想我的问题是,如何为 .NET Core 安装数据提供程序?我在机器上安装了 .NET Framework 4.5,它可以毫无问题地获取数据提供程序。我不想将 System.Data.SqlClient
安装为本地项目的 Nuget,因为这会添加一个依赖项,使 DbProviderFactory
变得无关紧要。也就是说,我已经尝试在一个使用我的库作为测试的项目中安装 System.Data.SqlClient
,但它仍然没有被选中。
在 .NET Framework 中,提供程序通过 machine.config 自动可用,并且还在 GAC 中全局注册。
在 .NET Core 中,不再有 GAC 或全局配置。
这意味着您必须先在您的项目中注册您的提供商,如下所示:
using System.Collections.Generic;
using System.Data.CData.MySQL; // Add a reference to your provider and use it
using System.Data.Common;
using System.Linq;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
// Register the factory
DbProviderFactories.RegisterFactory("test", MySQLProviderFactory.Instance);
// Get the provider invariant names
IEnumerable<string> invariants = DbProviderFactories.GetProviderInvariantNames(); // => 1 result; 'test'
// Get a factory using that name
DbProviderFactory factory = DbProviderFactories.GetFactory(invariants.FirstOrDefault());
// Create a connection and set the connection string
DbConnection connection = factory.CreateConnection();
connection.ConnectionString = "Server = test, Database = test";
}
}
}
如您所见,我必须添加对我的提供商的引用,在本例中为 "System.Data.CData.MySQL"。
遗憾的是您不能再获得所有可用的提供程序,但这是我们在 .NET 核心中必须使用的。
(信息来自this GitHub corefx issue)
在 .net 核心中你必须注册工厂
对于SQL:
DbProviderFactories.RegisterFactory("System.Data.SqlClient", SqlClientFactory.Instance);
正如 Amer 之前提到的:
In .net core you have to register the Factory
For SQL: DbProviderFactories.RegisterFactory("System.Data.SqlClient",
SqlClientFactory.Instance);
但是,要做到这一点,您应该将 System.Data.SqlClient
nuget 包添加到您的项目中。
像这样(工具 -> Nuget 包管理器 -> 包管理器控制台)
Find-Package SQLClient
Install-Package System.Data.SqlClient -ProjectName YourProjectName
我正在将一个库移植到 .NET Core 2.1,因为它支持 DbProviderFactory。在大多数情况下它运行良好 - 它可以编译,但是当 运行 我得到一个错误:
System.ArgumentException: 'The specified invariant name 'System.Data.SqlClient' wasn't found in the list of registered .NET Data Providers.'
我已经使用 DbProviderFactories.GetFactoryClasses()
检查是否安装了任何提供程序,但似乎没有(结果 table 中的 0 行)。
所以我想我的问题是,如何为 .NET Core 安装数据提供程序?我在机器上安装了 .NET Framework 4.5,它可以毫无问题地获取数据提供程序。我不想将 System.Data.SqlClient
安装为本地项目的 Nuget,因为这会添加一个依赖项,使 DbProviderFactory
变得无关紧要。也就是说,我已经尝试在一个使用我的库作为测试的项目中安装 System.Data.SqlClient
,但它仍然没有被选中。
在 .NET Framework 中,提供程序通过 machine.config 自动可用,并且还在 GAC 中全局注册。 在 .NET Core 中,不再有 GAC 或全局配置。 这意味着您必须先在您的项目中注册您的提供商,如下所示:
using System.Collections.Generic;
using System.Data.CData.MySQL; // Add a reference to your provider and use it
using System.Data.Common;
using System.Linq;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
// Register the factory
DbProviderFactories.RegisterFactory("test", MySQLProviderFactory.Instance);
// Get the provider invariant names
IEnumerable<string> invariants = DbProviderFactories.GetProviderInvariantNames(); // => 1 result; 'test'
// Get a factory using that name
DbProviderFactory factory = DbProviderFactories.GetFactory(invariants.FirstOrDefault());
// Create a connection and set the connection string
DbConnection connection = factory.CreateConnection();
connection.ConnectionString = "Server = test, Database = test";
}
}
}
如您所见,我必须添加对我的提供商的引用,在本例中为 "System.Data.CData.MySQL"。
遗憾的是您不能再获得所有可用的提供程序,但这是我们在 .NET 核心中必须使用的。
(信息来自this GitHub corefx issue)
在 .net 核心中你必须注册工厂
对于SQL: DbProviderFactories.RegisterFactory("System.Data.SqlClient", SqlClientFactory.Instance);
正如 Amer 之前提到的:
In .net core you have to register the Factory
For SQL: DbProviderFactories.RegisterFactory("System.Data.SqlClient", SqlClientFactory.Instance);
但是,要做到这一点,您应该将 System.Data.SqlClient
nuget 包添加到您的项目中。
像这样(工具 -> Nuget 包管理器 -> 包管理器控制台)
Find-Package SQLClient
Install-Package System.Data.SqlClient -ProjectName YourProjectName