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().Property(h => h.MigrationId).HasMaxLength(100).IsRequired();
            modelBuilder.Entity().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
    {
        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)

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