«Не удалось найти или загрузить зарегистрированный поставщик данных .Net Framework» с MySQL + ASP.NET.

StackOverflow https://stackoverflow.com/questions/2497302

  •  21-09-2019
  •  | 
  •  

Вопрос

Как нам это исправить?Этот вопрос неоднократно поднимался в Интернете, но это всегда обходной путь.Всегда копируйте MySql.data.dll в каталог bin или явно указывайте, какую версию вы хотите.Каков «правильный» подход к использованию DbProvderFactory для MySQL с ASP.NET?

Я хотел бы иметь возможность разрабатывать локально и не беспокоиться о том, какая версия установлена ​​на сервере.В нынешнем виде, если я копирую свою собственную версию, я должен убедиться, что они используют именно ее.Кажется, легко сломать.

Это было полезно?

Решение

Если рассматриваемой сборки нет в GAC, то она должна существовать в пути, т.е.папка bin.Если вы находитесь в GAC, собрание должно быть подписано.Я предполагаю, что создатели MySql.data.dll не подписали dll, поэтому вы не сможете поместить ее в GAC на сервере.Итак, копирование dll — ваше решение.

Другие советы

Другая причина этой ошибки была отмечена пользователем в аналогичной теме. здесь Я скопировал ответ пользователя ниже на случай, если ссылка изменится.

Я только что увидел, что причиной этого исключения в моем случае были разные версии dll и записи конфигурации.Итак, иногда действительно имеющаяся у вас dll (установленная с помощью nuget или другим способом) отличается от записи в узле app.config.Этот раздел, если не в app.config, также может быть найден в Windows Microsoft.net Framework64 v4.0.30319 config machine.config и близлежащие папки.Изменение версии в записи на версию dll решило проблему.

Вот как я заставил работать соединитель MySQL:

В файле Machine.config в разделе DbProviderFactories добавьте следующее:

<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.7.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />

*Обратите внимание, что номер версии и PublicKeyToken будут различаться в зависимости от установленной версии соединителя MySQL.Этот пример предназначен для v6.7.4.0 и v2.0 dot net.

Next Copy %Program Files % mysql mysql Connector Net 6.7.4 Assemblies v2.0 mysql.data.dll до %windows assembly.

Надеюсь, это кому-то поможет :)

Другой способ использования кода без app.config:(не забудьте установить правильную версию MySql.Data в этом коде)

  public class MySqlDbConfiguration: DbConfiguration 
{
    public MySqlDbConfiguration()
    {
        SetDefaultConnectionFactory(new MySqlConnectionFactory());
        SetProviderServices(MySqlProviderInvariantName.ProviderName, new MySqlProviderServices());
        RegisterFactoryIfRequired();
    }

    private static void RegisterFactoryIfRequired()
    {
        string dataProvider = @"MySql.Data.MySqlClient";
        string dataProviderDescription = @".Net Framework Data Provider for MySQL";
        string dataProviderName = @"MySQL Data Provider";
        string dataProviderType =
            @"MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d";

        bool addProvider = true;
        var dataSet = ConfigurationManager.GetSection("system.data") as DataSet;
        foreach (DataRow row in dataSet.Tables[0].Rows)
        {
            if ((row["InvariantName"] as string) == dataProvider)
            {
                // it is already in the config, no need to add.
                addProvider = false;
                break;
            }
        }

        if (addProvider)
            dataSet.Tables[0].Rows.Add(dataProviderName, dataProviderDescription, dataProvider, dataProviderType);

        // test it
        var factory = DbProviderFactories.GetFactory("MySql.Data.MySqlClient");
    }

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top