Visual Studio 2012を使用してAsp.net Mvc-5アプリケーションの作業を開始しました。それで、Enity Framework-6とMySQL 6.8.3.0をnugetからダウンロードしました。 db Contextコマンドを使用してデータベースを作成しようとしたとき
dbContext.Database.CreateIfNotExists();
この例外がスローされました。
指定されたキーが長すぎました。キーの最大長は767バイトです
私はそれを検索しましたが、解決策を見つけることができません。検索中に得た1つのことは、これは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コンテキストクラス。すべてのモデルを削除しましたが、1つのモデルをそのままにしておきます
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; }
}
誰かがこの問題を手伝ってくれる?
ありがとうございました。
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; }
}
ASP.NET Identityを使用している場合、これが発生している場所が3つあります
私が出会ったほとんどの記事には、基本的にユーザー名とメールの長さを128文字に減らすソリューションがあります。ただし、メールアドレスの公式仕様は256 ANSI文字であるため、これは受け入れられないことがわかりました。
私の解決策は:
私の解決策は https://github.com/timdinhdotcom/MySql.AspNetIdentity にあります。
以下の構成コードを使用してください...これで問題が解決しました:
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));
}
}
この投稿のすべての回答を試してもエラーが発生する場合は、MySQLサーバーで次のコマンドを実行してみてください。
set GLOBAL storage_engine='InnoDb';
バグはここに報告されました: http://bugs.mysql.com/bug.php?id=4541
article を見て、それが役立つかどうかを確認してください。特に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();
}
}
MYSQlでNVARCHARフィールドをvarcharに変更する簡単な方法があります。この行をIdentityModel.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();
}
}
あなたはこのリンクを見なければなりません https://stackoverflow.com/a/27082231/92974
<entityFramework codeConfigurationType = "MySql.Data.Entity.MySqlEFConfiguration、MySql.Data.Entity.EF6">
次のコマンドを実行して、この問題を解消しました。
Enable-Migrations -EnableAutomaticMigrations -Force -ContextTypeName ApplicationDbContext
初期移行を作成せずに:
Update-Database
テーブルは問題もエラーもなく作成されました