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

00007

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:

<connectionStrings>
    <add name="Contexto" 
                        connectionString="Database=banco_teste;Data                Source=localhost;UserId=root;Password="
  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.

000011

 

Na classe Configuration utilizamos o Método SetSqlGenerator para atribuir um MySqlMigrationSqlGenerator.

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

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.

000012

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 MySqlHisto             ryContext(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!

 

 

Anúncios

18 comentários sobre “Entity Framework – Code First Migrations com Mysql

  1. Olá. Muito bom o artigo, no entanto estou enfrentando um problema. Estou testando um projeto com arquitetura DDD, faço exatamente boa parte do que descreveu, pois, algumas das advertências citadas não aconteceram comigo, mas quando tento Update-Database, tenho como erro “Exception has been thrown by the target of an invocation.”. Já quebrei a cabeça e não consigo entender o que há de errado. Já se deparou com esse erro antes?

    Obrigado!

    • Olá Uitan, essa exceção pode ser por vários motivos. Teria que analisar melhor o código e as configurações do seu projeto. A mensagem que aparece é só essa mesmo? Não teriam mais detalhes
      sobre as innerException? Qual a versão do seu MySql?
      Já tentou reinstalar o connector mysql? A versão dele é a 6.9.5?
      No exemplo eu utilizo o framework 4.0.
      As vezes são detalhes pequenos que nos faz perder muito tempo resolvendo. Já tive alguns problemas parecidos para configurar o Migration, mais sempre da certo. Caso não consiga resolver poste mais detalhes que tentamos ajudar.

      obrigado pelo comentário!

  2. Aqui o problema do tamanho limite para a chave continuou. Ainda tentei decorar minha DbContext com essa classe MySqlConfiguration, tentei colocar um “DbConfiguration.SetConfiguration(new lMySqlConfiguration());” dentro do construtor da DbContext, tentei mudar os nomes para ver se não estava conflitando com classes nativas da framework do MySql, mas nada funcionou.

    Ele chega a gerar todas as minhas outras tabelas, menos a __migrationhistory.

  3. Descobri qual era o problema. No meu caso, uso Identity, então quando o “update-database” é executado, o código tenta gerar as tabelas do Identity (AspNetUsers, AspNetRoles, etc), e tem campos “string” destas tabelas que por padrão são gerados com 256 de tamanho, aí dá o erro de limite de bytes porque o código tenta gerar chaves para estes campos. Configurei no OnModelCreating do meu context para que estes campos tenham 200 de tamanho e resolveu!!!!

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s