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 и получать удовольствие!

Ответы на вопрос(7)

Ваш ответ на вопрос