指定的键太长;实体框架6中的最大键长度为767字节,MySQL错误

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (152)

我已经开始使用VisualStudio 2012开发ASP.NETMV-5应用程序。所以我从Nuget下载了实体框架-6和MySQL 6.8.3.0。当我试图使用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>

我的DB上下文类。我把所有的模型都去掉了,只剩下一个型号

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

有人能帮我解决这个问题吗?

谢谢

提问于
用户回答回答于

我已经更改了DbConfigurationType的DbContext。

现在它开始工作了

[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; }

}
用户回答回答于

如果正在使用ASP.NET标识,那么有三个地方正在发生这种情况

  1. 在迁移历史表中
  2. Identity yRole的Name属性
  3. ApplicationUser的用户名和电子邮件属性

我遇到的大多数文章都有一个解决方案,基本上可以将用户名和电子邮件的长度减少到128个字符。然而,我发现这是不可接受的,因为电子邮件地址的官方规范是256个Ansi字符。

我的解决办法是:

  1. 关闭Unicode以获取电子邮件和用户名
  2. 重写MySqlMigrationSqlGenerator并告诉它使用latin 1_一般_词整理,这是安西字符集。
  3. 减少角色名称的长度。这是可以接受的,因为角色名称不需要那么长
  4. 减少历史迁移的密钥长度,如Internet上的各种文章所述。

扫码关注云+社区