web-dev-qa-db-ja.com

指定されたキーが長すぎました。キーの最大長は767バイトですEntity Framework 6のMysqlエラー

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

誰かがこの問題を手伝ってくれる?

ありがとうございました。

18
Shoaib Ijaz

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

}
38
Shoaib Ijaz

ASP.NET Identityを使用している場合、これが発生している場所が3つあります

  1. 移行履歴テーブル
  2. IdentityRoleのNameプロパティ
  3. ApplicationUserのUsernameおよびEmailプロパティ

私が出会ったほとんどの記事には、基本的にユーザー名とメールの長さを128文字に減らすソリューションがあります。ただし、メールアドレスの公式仕様は256 ANSI文字であるため、これは受け入れられないことがわかりました。

私の解決策は:

  1. メールとユーザー名のユニコードをオフにする
  2. mySqlMigrationSqlGeneratorをオーバーライドし、latin1_general_ci collat​​e(これはansi文字セット)を使用するように指示します。
  3. ロール名の長さを短くしてください。ロール名はそれほど長くする必要がないため、これは許容されます
  4. インターネット上のさまざまな記事で説明されているように、履歴の移行のキーの長さを減らします。

私の解決策は https://github.com/timdinhdotcom/MySql.AspNetIdentity にあります。

5
Tien Dinh

以下の構成コードを使用してください...これで問題が解決しました:

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

}
2
Alper Ebicoglu

この投稿のすべての回答を試してもエラーが発生する場合は、MySQLサーバーで次のコマンドを実行してみてください。

set GLOBAL storage_engine='InnoDb';

バグはここに報告されました: http://bugs.mysql.com/bug.php?id=4541

2
Pabinator

article を見て、それが役立つかどうかを確認してください。特にMySqlHistoryContext.csConfiguration.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();
        }
    }
2
Kinyanjui Kamau

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

あなたはこのリンクを見なければなりません https://stackoverflow.com/a/27082231/92974

  • コンテキストクラスにDbConfigurationTypeAttributeを追加:[DbConfigurationType(typeof(MySqlEFConfiguration))]
  • アプリケーションの起動時にDbConfiguration.SetConfiguration(new MySqlEFConfiguration())を呼び出す
  • 構成ファイルでDbConfigurationタイプを設定します。

<entityFramework codeConfigurationType = "MySql.Data.Entity.MySqlEFConfiguration、MySql.Data.Entity.EF6">

0
Kim Ki Won

次のコマンドを実行して、この問題を解消しました。

Enable-Migrations -EnableAutomaticMigrations -Force -ContextTypeName ApplicationDbContext

初期移行を作成せずに:

Update-Database

テーブルは問題もエラーもなく作成されました

0
Jorge Cuevas