Указанный ключ слишком длинный; максимальная длина ключа - 767 байтов Ошибка Mysql в Entity Framework 6

Я начал работать над приложением Asp.net Mvc-5 с помощью visual studio 2012. Так что я загрузил Entity Framework-6 и MySQL 6.8.3.0 из nuget. Когда я попытался создать базу данных с помощью команды db Context

dbContext.Database.CreateIfNotExists();

Это исключение.

Указанный ключ был слишком длинным; максимальная длина ключа составляет 767 байт.

Я сделал поиск по нему, но не могу найти решение. Одна вещь, которую я получил во время моего поиска, может быть проблемой символов Unicode. Я не знаю, как решить эту проблему.

Обновление

Я использую следующую конфигурацию

<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <providers>
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient" />
      <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data>
</configuration>

My DB Context class. Я удалил все модели, оставив только одну модель.

public class MyContext : DbContext
{
    public MyContext()
        : base("myconn")
    {
        this.Configuration.ValidateOnSaveEnabled = false;
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.PluralizingTableNameConvention>();
        base.OnModelCreating(modelBuilder);
    }

    public DbSet<ModelOne> ModelOne { get; set; }

}

Модельный класс

public class  ModelOne
{
        [Key]
        public int CreatedId { get; set; }
        public Nullable<int> UserId { get; set; }
        public Nullable<DateTime> Date { get; set; }
        public string Description { get; set; }
  }

Может ли кто-нибудь помочь мне с этой проблемой?

Спасибо.

Ответы

Ответ 1

Я изменил DbConfigurationType для DbContext.

Получил из этого ссылку fooobar.com/questions/355032/...

Теперь он работает

[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class MyContext : DbContext
{
    public MyContext()
        : base("myconn")
    {
        this.Configuration.ValidateOnSaveEnabled = false;
    }

    static MyContext()
    {
            DbConfiguration.SetConfiguration(new MySql.Data.Entity.MySqlEFConfiguration());
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.PluralizingTableNameConvention>();
        base.OnModelCreating(modelBuilder);
    }

    public DbSet<ModelOne> ModelOne { get; set; }

}

Ответ 2

Если вы используете идентификатор ASP.NET, тогда есть 3 места, где это происходит

  • В таблице истории миграции
  • Свойство Name IdentityRole
  • Свойство Username и Email для ApplicationUser

В большинстве статей, которые я нашел, есть решение, которое в основном уменьшает длину имени пользователя и электронной почты до 128 символов. Тем не менее, я обнаружил, что это неприемлемо, потому что официальная спецификация для адреса электронной почты составляет 256 ansi символов.

Мое решение было:

  • Отключить unicode для электронной почты и имени пользователя
  • переопределите MySqlMigrationSqlGenerator и скажите ему использовать latin1_general_ci collate, который представляет собой набор символов ansi.
  • уменьшить длину имени роли. Это приемлемо, поскольку имя роли не должно быть таким длинным
  • уменьшить длину ключа для миграции истории, как описано в различных статьях в Интернете.

Вы можете найти мое решение в https://github.com/timdinhdotcom/MySql.AspNetIdentity

Ответ 3

Посмотрите на статью и посмотрите, помогает ли она. Особенно добавлены классы MySqlHistoryContext.cs, Configuration.cs и MySqlInitializer.cs.

Здесь вы найдете свое решение.

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();
        }
    }

Ответ 4

Используйте код конфигурации ниже... Это решило мою проблему:

internal sealed class Configuration : DbMigrationsConfiguration<MDbContext>
{       
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        CommandTimeout = 3600;

        DbConfiguration.SetConfiguration(new MySql.Data.Entity.MySqlEFConfiguration());
        SetSqlGenerator(MySql.Data.Entity.MySqlProviderInvariantName.ProviderName, new MySql.Data.Entity.MySqlMigrationSqlGenerator());
        SetHistoryContextFactory(MySql.Data.Entity.MySqlProviderInvariantName.ProviderName, (connection, schema) => new MySql.Data.Entity.MySqlHistoryContext(connection, schema));
    }

}

Ответ 5

Если вы попробовали все ответы в этом сообщении и все еще получили ошибку, попробуйте запустить эту команду на сервере MySQL:

set GLOBAL storage_engine='InnoDb';

Об этом сообщается здесь: http://bugs.mysql.com/bug.php?id=4541

Ответ 6

Вы должны увидеть эту ссылку fooobar.com/questions/176191/...

  • Добавление атрибута DbConfigurationTypeAttribute в класс контекста: [DbConfigurationType (TypeOf (MySqlEFConfiguration))]
  • Вызов DbConfiguration.SetConfiguration(новый MySqlEFConfiguration()) при запуске приложения
  • Задайте тип DbConfiguration в файле конфигурации:

< entityFramework codeConfigurationType = "MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6" >

Ответ 7

Я избавился от этой проблемы, запустив:

Enable-Migrations -EnableAutomaticMigrations -Force -ContextTypeName ApplicationDbContext

И без создания начальной миграции:

Update-Database

Таблицы были созданы без каких-либо проблем и ошибок