Migrando e atualizando um projeto .Net MVC 3 com MySQL no Visual Studio 2019 Community

Instalei o Visual Studio 2019 e precisava fazer manutenção nos meus sistemas .Net com MySQL desenvolvidos no Visual Studio 2015. É claro que não foi simples, então seguem algumas dicas para quem desejar fazer o mesmo!

Olá, já faz um bom tempo que não escrevo algo por aqui. Muito trabalho aconteceu neste tempo, assim temos muito conteúdo acumulado para escrever aqui, o que faremos conforme for sobrando tempo. 

Hoje vou compartilhar convosco como consegui superar alguns problemas que tive ao migrar um projeto antigo para o novo Visual Studio 2019 Community.
O projeto é simples, um site .Net MVC Razor que usa o MySQL com Entity Framework através do Conector/Net. O site em questão (que já está no ar operando firme e forte) é o http://recantodosimoveis.com.br

Sempre que o Visual Studio lançava uma grande versão, sempre havia muitas dúvidas sobre que versão dos componentes MySQL funcionariam com o EntityFramework. Assim, a comunidade do MySQL criou várias páginas que orientam quanto a isso dentro do site MySQL.com.
Graças ao trabalho desses excelentes profissionais, cheguei à página que me deu o primeiro passo para a minha migração/atualização: https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework60.html.
 
Primeiro passo, cumprir os Requisitos para que o MySql funcione no EntityFramework 6 (sim, se você ainda usa o 5, hora de finalmente atualizar pro 6):
  • Connector/NET 6.10.x or 8.0.x
  • MySQL Server 5.5 or higher
  • Entity Framework 6 assemblies
  • .NET Framework 4.0 or higher (.NET Framework 4.5.1 or higher is required for Connector/NET 6.10 and 8.0)
Começando pelo MySQL, atualizei meu parque de produtos MySQL, via MySQL Installer, conforme mostra a imagem abaixo:
O único produto que não foi possível atualizar via MySQL Installer foi o MySQL for VisualStudio, que ainda não possui uma versão release disponível para o Visual Studio 2019. Entretanto, no endereço https://dev.mysql.com/downloads/windows/visualstudio/ , na sessão Development Releases, você consegue baixar a versão 2.0.5 que está em fase "Beta".

Como o servidor de hospedagem suporta ainda até a versão 4.5 do Framework, eu atualizei o Framework de todo o projeto para rodar no 4.5.2.

Com todos os produtos MySQL atualizados, vamos abrir o projeto 'antigo' no Visual Studio 2019. O que? Você quer saber se não vamos instalar nada além do Visual Studio antes disso? Não é preciso! Nós vamos puxar para cada projeto desenvolvido os seus pacotes requeridos, como os componentes MySQL e EntityFramework, via NuGet. Essa flexibilidade está disponível desde o VS 2015.

Ao abrir o projeto, o Visual Studio 2019 Community informou que era preciso convertê-lo para o novo formato. Com uma cópia do projeto salva em um dispositivo seguro, fiz o procedimento e, felizmente, tudo correu bem. Entretanto, ao abrir o NuGet para atualizar os pacotes do projeto, começaram os problemas.

Comecei acessando os NuGet Packages para toda a solução:

 
E fiz os updates recomendados, incluindo os do MVC, Razor, Web e EntityFramework. Para rodar o MySQL, você precisa de dois componentes: MySQL.Data e MySQL.Data.Entities. Eu os inseri em cada camada que teria acesso ao repositório. Hoje já temos modelos de arquitetura muito melhores, mas não vamos entrar nesse assunto agora. Esse é um assunto que vamos tratar em um outro artigo. Assim, você deverá fazer a instalação desses pacotes na sua solução de acordo com a arquitetura do seu projeto.


Após realizar os updates dos pacotes, já informo AGORA o problema que enfrentei: O Visual Studio 2019 Community não atualizou TODAS as referências a eles nos diversos arquivos que os mencionam dentro do projeto.
ATENÇÃO: Isso aconteceu com os pacotes do MySQL, do EntityFramework, MVC e Razor.

COMO RESOLVER O PROBLEMA: para cada projeto da solução, faça:
  1. Clique com o botão direito do mouse no projeto e acione o recurso Unload Project; 
  2. Clique com o botão direito do mouse no projeto descarregado e acione o recurso Edit MyProject.csproj;
  3. Localize todas as referências dos pacotes atualizados e informe a versão correta, caso não tenha sido atualizado;
  4. Nos arquivos App.config e/ou Web.config, muito provavelmente você que criar o Provider manualmente. Segue o código dele:
    1. <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.EntityFramework" />
    2. No App.config, logo após a tag </startup>, e no Web.config, logo após </connectionString>, cole esse código:
        <system.data>
          <DbProviderFactories>
            <remove invariant="MySql.Data.MySqlClient" />
            <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=8.0.16.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
          </DbProviderFactories>
        </system.data>
  5. Caso o provider já exista, nas referências, onde estiver escrito MySql.Data.Entity.EF6, trocar para MySql.Data.EntityFramework, se houver;
  6. Salve as alterações e feche o arquivo;
  7. Clique com o botão direito do mouse no projeto e acione o recurso Reload Project;
  8. Acesse as References e verifique se as bibliotecas EntityFramework, MySql.Data e MySql.Data.Entities estão com suas versões corretas. Se não estiverem, remova-as e adicione as referências com as versões corretas;
  9. Acesse o arquivo packages.config e repita os passos 3 e 4 dessa lista;
  10. Acesse o arquivo App.config e/ou Web.config e repita os passos 3 e 4 dessa lista;
  11. Refaça seu arquivo .edmx. O arquivo antigo deverá ser excluído, inclusive fisicamente, para que você possa criar um arquivo novo com o mesmo nome;
  12. Caso você não consiga criar o arquivo .edmx, possivelmente o projeto ainda possui alguma referência errada. Faça uma conferência para verificar se ficou algum ponto sem atualizar (eu mesmo precisei rever os arquivos várias vezes, pois haviam referências que eu nem lembrava existir);
  13. No arquivo Global.asax, o comando Database.DefaultConnectionFactory = new SqlConnectionFactory(...); ficou obsoleto. Usando o próprio Quick Actions and Refactoring... do Visual Studio, você adiciona o marcador Obsolete acima da função que o usa. É a forma mais prática de resolver o problema;
  14. Como eu atualizei também o MVC, Razor e Web, precisei fazer as mesmas atualizações manuais de versões nos arquivos mencionados acima;
  15. Precisei atualizar todas as Views para atualizar algumas chamadas do Razor para o LabelFor;
  16. Pronto, site rodando plenamente;
  17. Para publicar o site em um servidor, precisei atualizar a segurança dele de Medium Trust para Full Trust. 
Eu não me recordo de ter feito nada adicional no projeto, apenas muitas pesquisas para descobrir os problemas que descrevi aqui. Caso vocês encontrem outros problemas, interajam conosco nos comentários. Vamos procurar ajudá-los na medida do possível.

Boa migração para vocês e uma excelente programação!

1 comentários

avatar
Alexander Aleyne em 17/07/2019 disse:
Parabéns, acho que essa experiência na migração desses projetos, vai nos ajudar no domínio do framework. Responder

Envie seu comentário