Entity Framework – Code First Migrations com Mysql


Bem Vindo mais uma vez. Dessa vez vou falar sobre um assunto que pode interessar a muitos desenvolvedores. Atualmente um dos SGBD mais utilizados em projetos WEB é o MYSQL, pelo fato de ser free, a maioria dos servidores WEB disponibilizam este banco de dados como opção padrão. Também é um gerenciador muito eficiente. Creio que dispensa mais informações sobre suas vantagens. Neste post vou demonstrar como configurar o connector .net do mysql e prepara-lo para utilizar EntityFramework Code First. Estou escrevendo sobre esse assunto por ter tido alguns contratempos nestas configurações. Vou demonstrar também alguns problemas que você poderá encontrar e também a respectiva solução. Para este tutorial utilizei o Visual Studio 2012.

Passo a Passo:
1 – Vamos começar baixando e instalando o MySql (Caso ainda não tenha instalado). Eu utilizo do XAMPP, já vem com o MySql e Apache configurado, o phpMyAdmin é uma opção bem prática para administrar o banco de dados. A versão que vou utilizar do mysql é (5.5.36).
http://dev.mysql.com/downloads/windows/installer/

2 – Baixe o connector .net do site:
http://dev.mysql.com/downloads/connector/net/

Instale o connector.

Instalação do Connector/net

Instalação do Connector/net

Utilizei a Instalação Tipical

Utilizei a Instalação Tipical

Não encontrei nenhum problema referente a essa instalação. A Versão do Connector/Net é  (6.9.5)

3 – Crie um novo Projeto Web MVC 5:
No exemplo dei o nome de MySqlComMigration para o projeto. Obs.: selecionei o framework .net 4. Caso use outra versão pode ser que tenha alguma diferença deste tutorial.

Criando o Projeto MVC

Criando o Projeto MVC

Selecione um projeto Basic com Razor

Selecione um projeto Empty com Razor para a view engine

4 – Instalando os pacotes necessários no projeto:
Agora precisamos instalar no projeto as dependências necessárias. O EntityFramework e os pacotes do MySql connector. Existem outras formas de fazer essas referências. Eu prefiro utilizar o NuGet.

Acesse o Packege Manager Console

Acesse o Package Manager Console


No console do NuGet digite o comando de instalação para o MySql.Data:

PM> Install-Package MySql.Data -Version 6.9.5

Instale tambem MySql.Data.Entity:

PM> Install-Package MySql.Data.Entity -Version 6.9.5
Repare que a Dependência para o EntityFramework já é resolvida e instalada automaticamente.

Repare que a Dependência para o EntityFramework já é resolvida e instalada automaticamente.

Após esses passos temos os pacotes necessários para trabalhar com o MySql e EntityFramework Migration. O próximo passo será criar as classes para manipulação das entidades.

5 – Crie a classe Contexto:
A classe Contexto será o objeto através do qual acessaremos as entidades mapeadas com o banco de dados. A classe deve herdar de DbContext. Neste Contexto existe uma classe mapeada ‘Contato’ para vermos o resultados da Migration no Banco de Dados.

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq;
using System.Web;
namespace MySqlComMigration
{
   public class Contexto : DbContext
   {
      public Contexto()
                   :base("Contexto")
      {

      }

      public DbSet<Contato> Contato { get; set; }

  }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MySqlComMigration {
    public class Contato
    {
       public int Id { get; set; }
       public string Nome { get; set; }
       public string Email { get; set; }
    }
}

 6- Vamos agora criar o banco de dados. Utilizei o phpMyadmin e criei um banco chamado banco_teste. Lembrando que as tabelas do banco serão geradas automáticamento quando rodarmos as migrações.

Criando o banco 'banco_teste'

Criando o banco ‘banco_teste’

7 – Agora abra o web.config e insira a stringConnection:

<configuration>
	<connectionStrings>
		<add name="Contexto" connectionString="Database=banco_teste;DataSource=localhost;UserId=root;Password="admin";providerName="MySql.Data.MySqlClient" />
	</connectionStrings>
</configuration>

O meu banco não tem senha, caso o seu precise informar coloque em “Password=”.

8 – Agora o Próximo passo é habilitarmos as migrações para o projeto. Isso fará com que a Pasta Migrations seja criada na raiz do projeto. Essa pasta contém o arquivo Configuration.cs onde podemos inserir as configurações para as migrações, caso necessário. No Prompt do NuGet rode o seguinte comando:

PM> Enable-Migrations

9 – Agora você vai observar um erro ao tentar adicionar uma nova migração. O MigrationSqlGenerator não foi encontrado. Pede-se para setar uma Implementação desse objeto.
Na classe Configuration utilizamos o Método SetSqlGenerator para atribuir um MySqlMigrationSqlGenerator.

public Configuration()
{
    AutomaticMigrationsEnabled = false;
    SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());
}

 Após isso as migrações são inicializadas rodando novamente o comando Enable-Migrations.

10 – Utilizamos o comando Add-Migration InitialMigration para adicionar uma nova Migration. Repare que InitialMigration é o nome atribuido à migration, você pode atribuir o nome que quiser.

11 – Vamos agora atualizar o Banco de Dados com a nova migration. O comando Update-Database tentará rodar a migration InitialMigration para criar a tabela Contato. Ao rodar o comando, o prompt mostrará o seguinte erro:

000013

Este problema significa que o o tamanho da chave primária para o mysql padrão foi ultrapassado. Para resolver este problema teremos que modificar esta configuração do mysql, porém faremos isso via código. Para personalizar as configurações do banco de dados temos que implementar DBConfiguration. No construtor utilizamos o método SetHistoryContext onde configuramos a classe que vamos implementar as modificações.

namespace MySqlComMigration{

 public class MySqlConfiguration : DbConfiguration
  {
    public MySqlConfiguration()
    {
        SetHistoryContext(
            "MySql.Data.MySqlClient", (conn, schema) => new MySqlHistoryContext(conn, schema));
    }
  }

Adicionamos ao projeto a classe MySqlHistoryContext. Nesta classe podemos sobrescrever o metodo OnModelCreating onde iremos modificar o tamanho máximo da chave.

public class MySqlHistoryContext : HistoryContext{

   public MySqlHistoryContext(DbConnection connection, string defaultSchema): base(connection, defaultSchema) {

   }

   protected override void OnModelCreating(DbModelBuilder modelBuilder){
       base.OnModelCreating(modelBuilder);
       modelBuilder.Entity<HistoryRow>().Property(h => h.MigrationId).HasMaxLength(100).IsRequired();
        modelBuilder.Entity<HistoryRow>().Property(h => h.ContextKey).HasMaxLength(200).IsRequired();
    }
 }

 12 – E por fim rodamos o Update-Database novamente. Pronto! Se tudo correu bem foram criadas as tabelas Contato e _MigrationHistory no banco de dados. E agora é só continuar o projeto.

000016

Update-Database com sucesso!

000017

Tabelas no MySql criadas

Estrutura do Projeto no Solution Explorer

Estrutura do Projeto no Solution Explorer

Então é isso.. Espero que tenha ajudado. Caso tenha alguma duvida pode deixar ai nos comentários que tentaremos ajudar.

Obrigado e até mais!

c# · ‎entityframework · ‎entity · ‎framework · ‎mysql · ‎codefirst · ‎migrations

Última atualização: 25/11/2017 às 21:10


  • Buscar