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é.
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 )
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
Dans le noyau .net, vous devez enregistrer l'usine
Pour SQL: DbProviderFactories.RegisterFactory ("System.Data.SqlClient", SqlClientFactory.Instance);