C# 指定的密钥太长;实体框架6中的最大密钥长度为767字节Mysql错误
我已经开始使用visual studio 2012开发Asp.net Mvc-5应用程序。所以我从nuget下载了Entity Framework-6和MySQL 6.8.3.0。当我尝试使用db Context命令创建数据库时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字符问题。我不知道如何处理这个问题 已更新 我正在使
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个地方会发生这种情况
- 在上下文类上添加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