Entity Framework с MySql и Migrations терпит неудачу, потому что «максимальная длина ключа составляет 767 байтов»
[Редактировать] Эта проблема была решена! Смотрите инструкцию в конце поста.
[Редактировать 2] Хорошо, этот поток старый, и более новые версии MySQL Connector уже справляются с этим с помощью распознавателей MySQL EF. Ищите ответ @KingPong в этой теме. Я не проверял это, все же.
Я пытаюсь использовать MySql и EntityFramework с миграциями, но что-то не так.
Когда я вхожуUpdate-Database -Verbose
в консоли диспетчера пакетов EF выполняет некоторые запросы, которые «отражают» классы моей модели, и все идет отлично, НО затем EF пытается выполнить этот запрос:
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
И результат:Specified key was too long; max key length is 767 bytes
Я попытался изменить сортировку базы данных на utf-8, но все так же. Возможно, длина ключа составляет 450 символов, в математике UTF-8 (что я могу ошибаться), я думаю, что он пытается создать ключ длиной около 1800 байт.
Так как я новичок в EF, я следовал некоторым учебникам, и они сказали мне сделать это:
public Configuration()
{
AutomaticMigrationsEnabled = false;
SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());
}
Возможно, этот генератор SQL делает что-то не так, или сам EF просит генератор сделать ключ длиной до 767 байт.
Как я могу это исправить, избежать этой проблемы и заставить ее работать с MySql?
[Редактировать] Хорошо, эта проблема была решена. Вы должны сказать EF, что он должен изменить способ генерации таблицы __MigrationHistory.
Что я сделал: во-первых, создайте файл с именемMySqlHistoryContext.cs
(или что вы хотите) с этим содержанием:
...
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();
}
}
}
У вас может быть файл с именемConfiguration.cs
внутри вашегоMigrations
папка. Если да, внесите необходимые изменения, в противном случае создайте новый файл. На самом деле вы не сможете получить эту ошибку, если у вас не было этого файла, так как EF создает его автоматически, когда выAdd-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
}
}
затемUpdate-Database -Verbose
и получать удовольствие!