在.NET Core 2.1中安装.NET SQL Client之后,DbProviderFactories.GetFactoryClasses不返回任何结果

时间:2018-08-24 15:45:36

标签: c# .net-core dbproviderfactories

我现在将库移植到.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,但仍然没有被选中。

3 个答案:

答案 0 :(得分:8)

在.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中使用的功能。

(来自this GitHub corefx issue的信息)

答案 1 :(得分:1)

如阿米尔先前所述:

  

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

     

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

但是,要执行此操作,应将System.Data.SqlClient nuget程序包添加到项目中。

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

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

答案 2 :(得分:0)

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

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