指定密钥太长;最大密钥长度为767字节实体框架6中的Mysql错误

时间:2014-07-27 13:45:04

标签: c# mysql entity-framework entity-framework-6

我已经开始使用visual studio 2012开发Asp.net Mvc-5应用程序了。所以我从nuget下载了Entity Framework-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>

我的数据库上下文类。我删除了所有模型,只留下一个模型

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

任何人都可以帮我解决这个问题吗?

谢谢。

8 个答案:

答案 0 :(得分:38)

我更改了DbContext的DbConfigurationType。

来自此链接stackoverflow

现在正在运作

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

}

答案 1 :(得分:5)

如果你正在使用ASP.NET身份,那么有3个地方正在发生这种情况

  1. 在迁移历史记录表中
  2. IdentityRole的名称属性
  3. ApplicationUser的用户名和电子邮件属性
  4. 我遇到的大多数文章都有一个解决方案,基本上可以将用户名和电子邮件的长度减少到128个字符。但是,我发现这是不可接受的,因为电子邮件地址的官方规范是256 ansi字符。

    我的解决方案是:

    1. 关闭电子邮件和用户名
    2. 的unicode
    3. 覆盖MySqlMigrationSqlGenerator并告诉它使用latin1_general_ci collat​​e,这是ansi字符集。
    4. 减少角色名称的长度。这是可以接受的,因为角色名称不需要那么长
    5. 减少历史迁移的密钥长度,如Internet上的各种文章所述。
    6. 您可以在https://github.com/timdinhdotcom/MySql.AspNetIdentity

      找到我的解决方案

答案 2 :(得分:2)

看看这个article,看看它是否有帮助。特别是添加了MySqlHistoryContext.csConfiguration.csMySqlInitializer.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();
        }
    }

答案 3 :(得分:2)

使用下面的配置代码......这解决了我的问题:

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

}

答案 4 :(得分:1)

在MYSQl中有简单的方法可以将NVARCHAR字段更改为varchar在IdentityModels.cs中添加以下行

[DbConfigurationType(typeof(MySqlEFConfiguration))]
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, Role, int, UserLogin, UserRole, UserClaim>
{
    protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        //troca todos os campos NVARCHAR por varchar
        modelBuilder.Properties().Where(x =>
          x.PropertyType.FullName.Equals("System.String") &&
         !x.GetCustomAttributes(false).OfType<ColumnAttribute>().Where(q => q.TypeName != null && q.TypeName.Equals("varchar(max)", StringComparison.InvariantCultureIgnoreCase)).Any())
          .Configure(c =>
             c.HasColumnType("varchar(65000)"));

        modelBuilder.Properties().Where(x =>
          x.PropertyType.FullName.Equals("System.String") &&
         !x.GetCustomAttributes(false).OfType<ColumnAttribute>().Where(q => q.TypeName != null && q.TypeName.Equals("nvarchar", StringComparison.InvariantCultureIgnoreCase)).Any())
          .Configure(c =>
             c.HasColumnType("varchar"));
    }

    public ApplicationDbContext()  : base("DefaultConnection")
    {

    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

答案 5 :(得分:0)

如果您已尝试过本文中的所有答案并仍然收到错误,请尝试在MySQL服务器上运行此命令:

set GLOBAL storage_engine='InnoDb';

此处报告了错误:http://bugs.mysql.com/bug.php?id=4541

答案 6 :(得分:0)

你必须看到这个链接 https://stackoverflow.com/a/27082231/929740

  • 在上下文类中添加DbConfigurationTypeAttribute: [DbConfigurationType(typeof运算(MySqlEFConfiguration))]
  • 在应用程序启动时调用DbConfiguration.SetConfiguration(new MySqlEFConfiguration())
  • 在配置文件中设置DbConfiguration类型:
  

&LT; entityFramework codeConfigurationType =“MySql.Data.Entity.MySqlEFConfiguration,MySql.Data.Entity.EF6”&gt;

答案 7 :(得分:0)

我通过运行来解决这个问题:

Enable-Migrations -EnableAutomaticMigrations -Force -ContextTypeName ApplicationDbContext

没有创建初始迁移:

Update-Database

创建的表没有任何问题也没有错误