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!