DbProviderFactories.GetFactoryClasses не возвращает результатов после установки .NET SQL Client в .NET Core 2.1 - PullRequest
0 голосов
/ 24 августа 2018

Я портирую библиотеку на .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 необратимым. Тем не менее, я попытался установить System.Data.SqlClient в проекте, который использует мою библиотеку в качестве теста, но он все еще не собран.

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

В ядре .net необходимо зарегистрировать Фабрику

Для SQL: DbProviderFactories.RegisterFactory ("System.Data.SqlClient", SqlClientFactory.Instance);

0 голосов
/ 27 августа 2018

В .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)

...