[Изменить] Эта проблема решена! См. Инструкции в конце сообщения.
[Edit 2] Хорошо, этот поток устарел, а более новые версии MySQL Connector уже обрабатывают это с помощью MySQL EF-резольверов. Найдите ответ @KingPong на эту тему. Однако я его не тестировал.
Я пытаюсь использовать MySql и EntityFramework с Migrations, но что-то кажется неправильным.
Когда я вхожу 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
и получайте удовольствие!