“Falha ao encontrar ou carregar o provedor de dados da estrutura .NET registrado” com o MySQL + ASP.NET

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

  •  21-09-2019
  •  | 
  •  

Pergunta

Como reparamos isso? Essa questão já foi endereçada muitas vezes na Internet, mas é sempre uma solução alternativa. Sempre copiando o mysql.data.dll no diretório do seu bin ou declarando explicitamente qual versão você deseja. Qual é a abordagem "adequada" para usar o DBProvderFactory para MySQL com asp.net?

Eu gostaria de poder desenvolver localmente e não preocupar qual versão eles instalaram no servidor. Como está, se eu copiar minha própria versão, tenho que ter certeza de que é o que eles usam. Parece fácil de quebrar.

Foi útil?

Solução

Se a assembléia em questão não estiver no GAC, ele precisará existir no caminho, ou seja, a pasta BIN. O BE no GAC, a Assembléia deve ser assinada. Acho que os construtores do mysql.data.dll não assinaram a DLL para que você não consiga colocá -lo no GAC no servidor. Portanto, copiar a DLL é a sua solução.

Outras dicas

Outro motivo para esse erro foi observado por um usuário em um tópico semelhante aqui Eu tenho copiar colado os usuários respondem abaixo, caso o link mude

Acabei de ver que o motivo dessa exceção no meu caso foram as diferentes versões entre a DLL e a entrada de configuração. Portanto, às vezes a DLL que você realmente possui (instalada pela NUGET ou de outra maneira) difere da entrada no nó do app.config. Esta seção, se não estiver no app.config, também pode ser encontrada no Windows Microsoft.net Framework64 v4.0.30319 config Machine.config e pastas próximas. Alterar a versão na entrada da versão da DLL resolveu o problema.

Aqui como eu consegui o conector MySQL para funcionar:

No Machine.config sob dbProviderFacories, adicione a folga:

<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" />

*Nota O número da versão e o PublicKeyToken serão diferentes, dependendo da versão do conector MySQL que você instalou. Este exemplo é para v6.7.4.0 e v2.0 pontos de rede

Próximo cópia %Arquivos de programas % mysql mysql conector net 6.7.4 Assemblies v2.0 mysql.data.dll para %windows Assembly.

Espero que isso ajude alguém :)

Outra maneira através do código sem app.config: (não se esqueça de definir a versão certa mysql.data neste código)

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

}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top