web-dev-qa-db-fra.com

DbProviderFactories.GetFactoryClasses ne renvoie aucun résultat après l'installation de .NET SQL Client dans .NET Core 2.1

Je porte une bibliothèque sur .NET Core 2.1 maintenant qu'elle prend en charge DbProviderFactory. Pour la plupart, cela s'est bien passé - il compile, mais lors de l'exécution, j'obtiens une erreur:

System.ArgumentException: 'Le nom invariant spécifié' System.Data.SqlClient 'n'a pas été trouvé dans la liste des fournisseurs de données .NET enregistrés.'

J'ai utilisé DbProviderFactories.GetFactoryClasses() pour vérifier si des fournisseurs sont installés, et il ne semble pas y en avoir (0 lignes dans le tableau résultant).

Donc, je suppose que ma question est, comment puis-je installer les fournisseurs de données pour .NET Core? J'ai .NET Framework 4.5 sur la machine et il récupère les fournisseurs de données sans aucun problème. Je ne veux pas installer System.Data.SqlClient comme Nuget pour le projet local, car cela ajouterait une dépendance qui rendrait le DbProviderFactory non pertinent. Cela dit, j'ai essayé d'installer System.Data.SqlClient dans un projet qui utilise ma bibliothèque comme test et qui n'est toujours pas récupéré.

7
Allan Jardine

Dans .NET Framework, les fournisseurs sont automatiquement disponibles via machine.config et sont également enregistrés globalement dans le GAC. Dans .NET Core, il n'y a plus de GAC ni de configuration globale. Cela signifie que vous devrez d'abord enregistrer votre fournisseur dans votre projet, comme ceci:

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";
        }
    }
}

Comme vous pouvez le voir, j'ai dû ajouter une référence à mon fournisseur, "System.Data.CData.MySQL" dans ce cas.

Il est triste que vous ne puissiez plus simplement obtenir tous les fournisseurs disponibles, mais c'est avec cela que nous devons travailler dans .NET core.

(Informations provenant de ce problème de corefx GitHub )

11
Joshua VdM

Comme Amer l'a mentionné précédemment:

Dans le noyau .net, vous devez enregistrer l'usine

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

Cependant, pour ce faire, vous devez ajouter le System.Data.SqlClient nuget package à votre projet.

Comme ceci (Outils -> Gestionnaire de packages Nuget -> Console du gestionnaire de packages)

Find-Package SQLClient
Install-Package System.Data.SqlClient -ProjectName YourProjectName
1
Aleksandr Sorokin

Dans le noyau .net, vous devez enregistrer l'usine

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

0
Amer Jamaeen