ASP .NET Core MVC -  Migrar do SQL Server para MySql


Neste artigo veremos como migrar do SQL Server para MySql em uma aplicação ASP .NET Core MVC.

Pode não ser uma tarefa que ocorra com muita freqüência mas se precisar migrar o banco de dados de sua aplicação ASP .NET Core você esta preparado ?

Veremos como fazer isso migrando do SQL Server para o MySql que são dois banco de dados relacionais muito usados.

Neste artigo iremos usar os seguintes recursos :

O nosso ponto de partida será uma aplicação ASP .NET Core MVC que usa o banco de dados SQL Server.

Assim vamos criar uma aplicação ASP .NET Core MVC básica usando o VS 2019 e os recursos dos assistentes de forma a termos uma aplicação criada de forma simples e rápida. A seguir vamos fazer a migração do banco de dados desta aplicação.

Então vamos ao código...

Criando o projeto ASP .NET Core MVC

Abra o VS 2019 Community e crie um novo projeto via menu File-> New Project;

Selecione o template ASP .NET Core Web Application, e, Informe o nome da solução MvcAlunos (ou outro nome a seu gosto).

A seguir selecione .NET Core e ASP .NET Core 3.1 e marque o template Web Application e as configurações conforme figura abaixo:

Observe que não vamos definir a autenticação em nosso projeto.

Depois que o projeto foi criado, precisamos adicionar a referência aos seguintes pacotes:

Nota:  Para instalar usando a janela do Console use o comando Install-Package <nome_pacote> -version 3.1.7

Esses pacotes são necessários para realizarmos o acesso ao banco de dados SQL Server e aplicarmos o Migrations ao modelo de domínio e assim gerar o banco de dados e as tabelas.

Criando o modelo de domínio e a classe de contexto

Na pasta Models vamos criar a classe Imagem que representa nosso modelo de domínio :

using System;
using System.ComponentModel.DataAnnotations;
namespace MvcAlunos.Models
{
    public class Aluno
    {
        [Key]
        public int AlunoId { get; set; }
        [Required(ErrorMessage="Informe o nome do aluno")]
        [StringLength(100, ErrorMessage = "O nome não deve exceder 100 caracteres.")]
        public string Nome { get; set; }
        
        [Required(ErrorMessage = "Informe email do aluno")]
        [StringLength(200, ErrorMessage = "O email não deve exceder 200 caracteres.")]
        [EmailAddress]
        public string Email { get; set; }
        [DataType(DataType.Date)]
        public DateTime Nascimento { get; set; }
        [Range(15, 24)]
        public int Idade { get; set; }
        [Column(TypeName = "decimal(10,2)")]
        public decimal Mensalidade { get; set; }
        public bool Ativo { get; set; }
    }
}

Estou usando o recurso Data Annotations para validação dos dados do modelo de domínio Aluno.

Ainda na pasta Models vamos criar a classe de contexto AppDbContext que vai herdar de DbContext e onde vamos definir o mapeamento para da entidade para a tabela Alunos:

using Microsoft.EntityFrameworkCore;
namespace MvcAlunos.Models
{
    public class AppDbContext : DbContext
    {
        public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
        {
        }
        public DbSet<Aluno> Alunos { get; set; }
    }
}

Precisamos agora registrar a classe de contexto AppDbContext no framework DI da ASP.NET Core. Isso é feito dentro do método ConfigureServices() da classe Startup :

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<AppDbContext>(o =>
            {
                o.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
            });
            services.AddControllersWithViews();
        }

Agora vamos definir a string de conexão com banco de dados SQL Server no arquivo appsettings.json:

{
  "ConnectionStrings": {
    "DefaultConnection": "Data Source=...;Initial Catalog=AlunosDatabase;Integrated Security=True"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

Na seção ConnectionStrings você deve informar a sua string de conexão e o nome do banco de dados que deverá ser gerado no SQL Server. No exemplo eu informei o nome ImagensDB.

Aplicando o Migrations para o SQL Server

Podemos agora aplicar o Migrations para gerar o banco de dados AlunosDatabase e a tabela Alunos no SQL Server.

Abra uma janela no Package Manager Console e digite os comandos:

1- add-migration Inicial  : Para criar o script de migração

2- update-database  :  Para aplicar o script no SQL Server

Podemos agora abrir o Server Explorer no VS 2019 e verificar o banco de dados e a tabela gerada com a estrutura abaixo:

Agora já podemos criar nosso controlador e views.

Criando o controlador AlunosController e as views com EF Core

Vamos criar na pasta Controllers o controlador AlunosController e as respectivas Views usando o Scaffolding.

Clique com o botão direito do mouse sobre a pasta Controllers e selecione Add -> Controller;

Na janela abaixo selecione :  MVC Controller with views , using Entity Framework  e clique em Add;

Na próxima janela informe o Model, Data Context e demais informações conforme a figura abaixo:

Clicando em Add teremos o controlador AlunosController e as views geradas na pasta /Views/Alunos conforme mostra a figura a seguir:

Podemos executar o projeto e temos nossa aplicação ASP .NET Core MVC usando o SQL Server funcionando. Podemos agora incluir, consultar, atualizar e excluir dados da tabela Alunos no SQL Server.

Nota: Neste exemplo não criamos um Repositório para Alunos o que iria facilitar a nossa migração.

Migrando para o MySql

Vamos agora migrar o banco de dados SQL Server usado na aplicação MVC para o MySQL.

Precisaremos incluir os provedores para conectar o MySql e vamos usar o provedor: Pomelo.EntityFrameworkCore.MySql e também o pacote Pomelo.EntityFrameworkCore.MySql.Design

Para isso podemos instalar esses pacotes via menu Tools e clicar em Nuget Package Manager e a seguir em Manage Nuget Packages for Solution;

Após isso deveremos ter os seguintes pacotes instalados em nosso projeto:

A seguir vamos alterar incluir a string de conexão com o banco de dados MySql no arquivo appsettings.json:

{
  "ConnectionStrings": {
    "DefaultConnection": "Data Source=....\\SQLEXPRESS;Initial Catalog=AlunosDatabase;Integrated Security=True",
    "MySqlConnection": "Server=localhost;DataBase=AlunosDB;Uid=root;Pwd=*******"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

A seguir vamos alterar a definição o registro do contexto no método ConfigureServices para usar o provedor do MySql e a string de conexão definida acima:

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<AppDbContext>(o =>
            {
                o.UseMySql(Configuration.GetConnectionString("MySqlConnection"));
            });
            services.AddControllersWithViews();
        }

A migração dos dados poderá ser feita levando em conta os tipos de dados entre os dois SGBDs conforme tabela de conversão : https://dev.mysql.com/doc/workbench/en/wb-migration-database-mssql-typemapping.html reproduzida parcialmente abaixo:

Source Type MySQL Type Comment
INT INT  
TINYINT TINYINT UNSIGNED flag set in MySQL.
SMALLINT SMALLINT  
BIGINT BIGINT  
BIT TINYINT(1)  
FLOAT FLOAT Precision value is used for storage size in both.
REAL FLOAT  
NUMERIC DECIMAL  
DECIMAL DECIMAL  
MONEY DECIMAL  
SMALLMONEY DECIMAL  
CHAR CHAR/LONGTEXT Depending on its length. MySQL Server 5.6 and higher can have CHAR columns with a length up to 255 characters. Anything larger is migrated as LONGTEXT.
NCHAR CHAR/LONGTEXT Depending on its length. MySQL Server 5.6 and higher can have VARCHAR columns with a length up to 65535 characters. Anything larger is migrated to one of the TEXT blob types. In MySQL, a character set of strings depends on the column character set instead of the data type.
VARCHAR VARCHAR/MEDIUMTEXT/LONGTEXT Depending on its length. MySQL Server 5.6 and higher can have VARCHAR columns with a length up to 65535 characters. Anything larger is migrated to one of the TEXT blob types.
NVARCHAR VARCHAR/MEDIUMTEXT/LONGTEXT Depending on its length. MySQL Server 5.6 and higher can have VARCHAR columns with a length up to 65535 characters. Anything larger is migrated to one of the TEXT blob types. In MySQL, a character set of strings depends on the column character set instead of the data type.
DATE DATE  
DATETIME DATETIME  
DATETIME2 DATETIME Date range in MySQL is '1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999'. Note: fractional second values are only stored as of MySQL Server 5.6.4 and higher.

Vamos a seguir criar o banco de dados e a tabela AlunosDB no MySql.

Aplicando o Migrations para o MySql

Podemos agora aplicar o Migrations para gerar o banco de dados AlunosDB e a tabela Alunos no MySql.

Antes vamos remover a pasta Migrations criada no projeto quando aplicamos a migração para o SQL Server.

Após fazer isso abra uma janela no Package Manager Console e digite os comandos:

1- add-migration Inicial_MySql  : Para criar o script de migração

2- update-database  :  Para aplicar o script no MySql

Pronto ! Acabamos de criar o banco de dados e a tabela Alunos no MySql  conforme mostra a figura abaixo obtida do MySQL WorkBench :

Executando o projeto e incluindo um aluno teremos o seguinte resultado:

Agora se abrirmos a tabela Alunos no MySql veremos os dados do aluno que acabamos de incluir:

Migrando os dados do SQL Server para o MySQL

Se você estiver migrando de um banco de dados SQL Server que já contém muitos dados vai precisar migrar os dados para o banco de dados e as tabelas criadas no MySql.

Aqui existem diversas abordagens que você pode usar:

  1. Criar a sua própria migração
  2. Usar ferramentas de terceiros (geralmente pagas)
  3. Usar o Wizard e migração do MySQL WorkBench

Para usar a última opção acesse o menu Database e clique em Migration Wizard:

Depois clique em Start Migration e na janela a seguir defina os parâmetros para a conexão ODBC que será usada para conectar o SQL Server.

Ao continuar você vai informar a senha no MySQL e o assistente vai se conectar com a instância do SQL Server escolhida :

A seguir selecione o banco de dados que deseja migrar vou escolher o banco de dados LanchesDatabase que possui algumas tabelas.

A seguir basta seguir o assistente clicando em next até concluir a migração:

Ao final, podemos ver no MySQL WorkBench o banco de dados LancheDatabase com as tabelas migradas :

Pegue o projeto aqui: MvcAlunos.zip (sem as referências)

"Ninguém jamais viu a Deus; se nos amamos uns aos outros, Deus está em nós, e em nós é perfeito o seu amor.
Nisto conhecemos que estamos nele, e ele em nós, pois que nos deu do seu Espírito.
E vimos, e testificamos que o Pai enviou seu Filho para Salvador do mundo."

1 João 4:12-14

Referências:


José Carlos Macoratti