DbProviderFactory.GetFactoryClasses 在 .NET Core 2.1 中安装 .NET



我现在正在将一个库移植到 .NET Core 2.1 上,因为它支持 DbProviderFactory。在大多数情况下,它运行良好 - 它可以编译,但是运行时出现错误:

System.ArgumentException:"在已注册的 .NET 数据提供程序列表中找不到指定的固定名称'System.Data.SqlClient'。

我使用DbProviderFactories.GetFactoryClasses()来检查是否安装了任何提供程序,但似乎没有(结果表中有 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 core 中使用的提供程序。

(来自此GitHub corefx问题的信息(

正如Amer之前提到的:

在 .net 核心中,您必须注册工厂

对于SQL:DbProviderFactory.RegisterFactory("System.Data.SqlClient", SqlClientFactory.Instance(;

但是,若要执行此操作,应将System.Data.SqlClientnuget 包添加到项目中。

像这样(工具 -> Nuget 包管理器 -> 包管理器控制台(

Find-Package SQLClient
Install-Package System.Data.SqlClient -ProjectName YourProjectName

在 .net core 中,您必须注册工厂

对于 SQL: DbProviderFactories.RegisterFactory("System.Data.SqlClient", SqlClientFactory.Instance(;

我也有这个问题,但我用这种方法解决了它:

  1. 首先,您需要注册每个工厂:

    DbProviderFactories.RegisterFactory("System.Data.Obdc","System.Data.Odbc.OdbcFactory, System.Data.Odbc");

  2. DbProvider.FullTypeName将自动成为您插入到 RegisterFactoryMethod 的第一个参数中的字符串。(在本例中为System.Data.Odbc(

相关内容

  • 没有找到相关文章

最新更新