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 :
Visual Studio 2019 (16.6.5 ou superior)
NET Core 3.1
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:
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:
ASP .NET Core - Implementando a segurança com
ASP.NET Core MVC - Criando um Dashboard ...
C# - Gerando QRCode - Macoratti
VB e MYSQL - Macoratti
VB .NET - Login com MySql - Macoratti
C# - Acessando MySQL - Macoratti
C# - Um simples CRUD com MySql - Macoratti
C# - Criando uma aplicação com 3 camadas com MySQL
C# - Gerenciando um banco de dados MySQL