12

我正在将一个库移植到 .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在一个使用我的库作为测试的项目中,但它仍然没有被选中。

4

3 回答 3

17

在 .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 核心中使用的内容。

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

于 2018-08-27T12:50:31.853 回答
4

正如 Amer 之前提到的:

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

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

但是,要做到这一点,您应该将System.Data.SqlClientnuget 包添加到您的项目中。

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

Find-Package SQLClient
Install-Package System.Data.SqlClient -ProjectName YourProjectName
于 2019-08-27T09:31:34.837 回答
1

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

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

于 2019-07-02T14:30:23.463 回答