首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >指定的键太长;Entity Framework 6中的Mysql错误,最大键长度为767字节

指定的键太长;Entity Framework 6中的Mysql错误,最大键长度为767字节
EN

Stack Overflow用户
提问于 2014-07-27 21:45:04
回答 8查看 19.4K关注 0票数 19

我已经开始使用visual studio 2012开发Asp.net Mvc-5应用程序。所以我从nuget下载了Entity Framework-6和MySQL 6.8.3.0。当我尝试使用db Context命令创建数据库时

代码语言:javascript
复制
dbContext.Database.CreateIfNotExists();

抛出此异常。

指定的密钥太长;最大密钥长度为767字节

我已经对它进行了搜索,但找不到任何解决方案。我在搜索过程中得到的一件事,这可能是Unicode字符问题。我不知道如何处理这个问题。

已更新

我正在使用以下配置

代码语言:javascript
复制
<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上下文类。我删除了所有的模型,只保留了一个模型

代码语言:javascript
复制
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; }

}

模型类

代码语言:javascript
复制
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; }
  }

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

谢谢。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2014-07-28 15:23:16

我已经更改了DbContext的DbConfigurationType。

从这里得到这个链接stackoverflow

现在它起作用了

代码语言:javascript
复制
[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; }

}
票数 38
EN

Stack Overflow用户

发布于 2016-08-13 20:34:12

如果您使用的是ASP.NET Identity,那么有3个地方会发生这种情况

迁移历史记录表中的用户名,以及ApplicationUser的IdentityRole

  • The用户名和电子邮件属性的
  1. 属性

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

我的解决方案是:

  1. 关闭电子邮件和Username
  2. override MySqlMigrationSqlGenerator的unicode,并告诉它使用latin1_general_ci collate,这是ansi字符集。
  3. 缩短了角色名称的长度。这是可以接受的,因为角色名称不必是互联网上各种文章中描述的用于历史记录迁移的long
  4. reduce length。

你可以在https://github.com/timdinhdotcom/MySql.AspNetIdentity上找到我的解决方案

票数 5
EN

Stack Overflow用户

发布于 2015-07-16 11:46:20

如果你已经尝试了这篇文章中的所有答案,但仍然得到错误,那么尝试在MySQL服务器上运行以下命令:

代码语言:javascript
复制
set GLOBAL storage_engine='InnoDb';

这里报告了这个错误:http://bugs.mysql.com/bug.php?id=4541

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24981593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档