Entity Framework con MySql y migraciones fallan porque "la longitud máxima de la clave es de 767 bytes"

[Editar] ¡Este problema fue resuelto! Vea las instrucciones al final del post.

[Editar 2] Ok, este hilo es antiguo, y las versiones más nuevas de MySQL Connector ya manejan esto con los resolutores de MySQL EF. Busque la respuesta @KingPong en este hilo. Aunque no lo he probado.

Estoy tratando de usar MySql y EntityFramework con migraciones, pero algo parece estar mal.

Cuando entroUpdate-Database -Verbose en la Consola del administrador de paquetes, EF ejecuta algunas consultas que "reflejarán" mis clases de modelo, y todo va perfecto, PERO entonces EF intenta ejecutar esta consulta:

create table `__MigrationHistory` 
(
  `MigrationId` varchar(150)  not null 
  ,`ContextKey` varchar(300)  not null 
  ,`Model` longblob not null 
  ,`ProductVersion` varchar(32)  not null
  ,primary key ( `MigrationId`,`ContextKey`) 
 ) engine=InnoDb auto_increment=0

Y el resultado es:Specified key was too long; max key length is 767 bytes

Intenté cambiar la compilación de mi base de datos a utf-8, pero igual. Tal vez la longitud de la clave sea de 450 caracteres, haciendo la matemática UTF-8 (lo que podría estar equivocado), creo que está intentando crear una clave de aproximadamente 1800 bytes de longitud.

Como soy nuevo en EF, seguí algunos tutoriales y me dijeron que hiciera esto:

    public Configuration()
    {
        AutomaticMigrationsEnabled = false;

        SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());
    }

Quizás este generador de SQL esté haciendo algo incorrecto, o EF mismo le está pidiendo al generador que cree una clave de hasta 767 bytes.

¿Cómo puedo solucionarlo, evitar este problema y hacer que funcione con MySql?

[Editar] Ok, este problema fue resuelto. Tienes que decirle a EF que tiene que cambiar la forma en que genera la tabla __MigrationHistory.

Lo que hice: primero, crear un archivo llamadoMySqlHistoryContext.cs (o lo que quieras) con este contenido:

...
using System.Data.Common;
using System.Data.Entity;
using System.Data.Entity.Migrations.History;


namespace [YOUR NAMESPACE].Migrations //you can put any namespace here, but be sure you will put the corret using statement in the next file. Just create a new class :D
{
    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(); 
        }
    }
}

Es posible que tenga un archivo llamadoConfiguration.cs dentro de tuMigrations carpeta. En caso afirmativo, realice los ajustes necesarios, de lo contrario, cree un nuevo archivo. En realidad, no podrá llegar a este error si no tenía este archivo, ya que EF lo crea automáticamente cuandoAdd-Migration [name].

namespace [YOUR NAMESPACE].Migrations
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;

    internal sealed class Configuration : DbMigrationsConfiguration<CodeFirstMySql.Models.Context>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;

            SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator()); //it will generate MySql commands instead of SqlServer commands.

            SetHistoryContextFactory("MySql.Data.MySqlClient", (conn, schema) => new MySqlHistoryContext(conn, schema)); //here s the thing.



        }

        protected override void Seed(CodeFirstMySql.Models.Context context){}//ommited
    }
}

EntoncesUpdate-Database -Verbose ¡y divertirse!

Respuestas a la pregunta(7)

Su respuesta a la pregunta