«Не удалось найти или загрузить зарегистрированный поставщик данных .Net Framework» с MySQL + ASP.NET.
Вопрос
Как нам это исправить?Этот вопрос неоднократно поднимался в Интернете, но это всегда обходной путь.Всегда копируйте 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");
}
}