DbProviderFactories.GetFactoryClasses не возвращает результатов после установки.NET SQL Client в.NET Core 2.1
Я портирую библиотеку на.NET Core 2.1 теперь, когда она поддерживает DbProviderFactory. По большей части все прошло нормально - компилируется, но при запуске я получаю сообщение об ошибке:
System.ArgumentException: 'Указанное имя инварианта'System.Data.SqlClient'не найдено в списке зарегистрированных поставщиков данных.NET.'
Я использовал DbProviderFactories.GetFactoryClasses()
проверить, установлены ли какие-либо провайдеры, а их нет (0 строк в итоговой таблице).
Поэтому я думаю, что мой вопрос, как я могу установить поставщиков данных для.NET Core? У меня на компьютере установлен.NET Framework 4.5, и он без проблем забирает поставщиков данных. Я не хочу устанавливать System.Data.SqlClient
как Nuget для локального проекта, так как это добавит зависимость, которая сделает DbProviderFactory
irrelevent. Тем не менее, я попытался установить System.Data.SqlClient
в проекте, который использует мою библиотеку в качестве теста, и он до сих пор не выбран.
4 ответа
В.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)
Как упоминал ранее Амер:
В ядре.net вы должны зарегистрировать Factory
Для SQL: DbProviderFactories.RegisterFactory("System.Data.SqlClient", SqlClientFactory.Instance);
Однако для этого вам следует добавить System.Data.SqlClient
nuget в ваш проект.
Как это (Инструменты -> Диспетчер пакетов Nuget -> Консоль диспетчера пакетов)
Find-Package SQLClient
Install-Package System.Data.SqlClient -ProjectName YourProjectName
В ядре.net вы должны зарегистрировать Factory
Для SQL: DbProviderFactories.RegisterFactory("System.Data.SqlClient", SqlClientFactory.Instance);
У меня также была эта проблема, но я решил ее следующим подходом:
Сначала вам необходимо зарегистрировать каждую фабрику:
DbProviderFactories.RegisterFactory("System.Data.Obdc","System.Data.Odbc.OdbcFactory, System.Data.Odbc");
DbProvider.FullTypeName автоматически станет строкой, которую вы вставили в первый параметр RegisterFactoryMethod.(В данном случае System.Data.Odbc)