Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 指定的密钥太长;实体框架6中的最大密钥长度为767字节Mysql错误_C#_Mysql_Entity Framework_Entity Framework 6 - Fatal编程技术网

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

C# 指定的密钥太长;实体框架6中的最大密钥长度为767字节Mysql错误,c#,mysql,entity-framework,entity-framework-6,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字符问题。我不知道如何处理这个问题 已更新 我正在使

我已经开始使用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; }

}
公共类MyContext:DbContext
{
公共MyContext()
:base(“myconn”)
{
this.Configuration.ValidateOnSaveEnabled=false;
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
基于模型创建(modelBuilder);
}
公共DbSet 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; }
  }
公共类ModelOne
{
[关键]
public int CreatedId{get;set;}
公共可为空的用户标识{get;set;}
公共可空日期{get;set;}
公共字符串说明{get;set;}
}
有人能帮我解决这个问题吗


谢谢。

我已经更改了DbContext的DbConfigurationType

从这个链接得到的

现在它正在工作

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

}
[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
公共类MyContext:DbContext
{
公共MyContext()
:base(“myconn”)
{
this.Configuration.ValidateOnSaveEnabled=false;
}
静态MyContext()
{
SetConfiguration(新的MySql.Data.Entity.MySqlEFConfiguration());
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
基于模型创建(modelBuilder);
}
公共DbSet ModelOne{get;set;}
}
看看这个,看看它是否有用。特别是添加了
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();
        }
    }
公共类MySqlHistoryContext:HistoryContext
{
公共MySqlHistoryContext(DbConnection连接,字符串defaultSchema)
:base(连接,默认架构)
{
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity().Property(h=>h.MigrationId).HasMaxLength(100).IsRequired();
modelBuilder.Entity().Property(h=>h.ContextKey).HasMaxLength(200).IsRequired();
}
}

如果您尝试了本文中的所有答案,但仍然得到错误,请尝试在MySQL服务器上运行以下命令:

set GLOBAL storage_engine='InnoDb';

此处报告了错误:

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

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

}
内部密封类配置:dbmigtorinsconfiguration
{       
公共配置()
{
AutomaticMiggerationsEnabled=假;
CommandTimeout=3600;
SetConfiguration(新的MySql.Data.Entity.MySqlEFConfiguration());
SetSqlGenerator(MySql.Data.Entity.MySqlProviderInvariantName.ProviderName,新的MySql.Data.Entity.MySqlMigrationSqlGenerator());
SetHistoryContextFactory(MySql.Data.Entity.MySqlProviderInvariantName.ProviderName,(连接,模式)=>新建MySql.Data.Entity.MySqlHistoryContext(连接,模式));
}
}

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

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

    我的解决办法是:

  • 关闭电子邮件和用户名的unicode
  • 重写MySqlMigrationSqlGenerator并告诉它使用拉丁语1_general_ci collate,这是ansi字符集
  • 减少角色名称的长度。这是可以接受的,因为角色名不需要那么长
  • 如Internet上的各种文章所述,减少历史记录迁移的密钥长度
  • 您可以在

    找到我的解决方案。您必须查看此链接

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


    我通过运行以下命令解决了此问题:

    Enable-Migrations -EnableAutomaticMigrations -Force -ContextTypeName ApplicationDbContext
    
    在不创建初始迁移的情况下:

    Update-Database
    

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

    有一种简单的方法可以将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();
        }
    }
    
    [DbConfigurationType(typeof(MySqlEFConfiguration))]
    公共类ApplicationDbContext:IdentityDbContext
    {
    模型创建时受保护的覆盖无效(System.Data.Entity.DbModelBuilder modelBuilder)
    {
    基于模型创建(modelBuilder);
    //troca todos os campos NVARCHAR por varchar
    modelBuilder.Properties()。其中(x=>
    x、 PropertyType.FullName.Equals(“System.String”)&&
    !x.GetCustomAttributes(false).OfType()。其中(q=>q.TypeName!=null&&q.TypeName.Equals)(“varchar(max)”,StringComparison.Inv