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);

У меня также была эта проблема, но я решил ее следующим подходом:

  1. Сначала вам необходимо зарегистрировать каждую фабрику:

    DbProviderFactories.RegisterFactory("System.Data.Obdc","System.Data.Odbc.OdbcFactory, System.Data.Odbc");

  2. DbProvider.FullTypeName автоматически станет строкой, которую вы вставили в первый параметр RegisterFactoryMethod.(В данном случае System.Data.Odbc)

Другие вопросы по тегам