webentwicklung-frage-antwort-db.com.de

Angegebener Schlüssel war zu lang; Die maximale Schlüssellänge beträgt 767 Byte Mysql-Fehler in Entity Framework 6

Ich habe angefangen, mit Visual Studio 2012 an der Asp.net Mvc-5-Anwendung zu arbeiten. Deshalb habe ich Entity Framework-6 und MySQL 6.8.3.0 von nuget heruntergeladen. Beim Versuch, eine Datenbank mit dem Befehl db Context zu erstellen

dbContext.Database.CreateIfNotExists();

Diese Ausnahme wurde ausgelöst.

Angegebener Schlüssel war zu lang; Die maximale Schlüssellänge beträgt 767 Bytes

Ich habe danach gesucht, finde aber keine Lösung. Eine Sache, die ich während meiner Suche bekam, kann das Problem mit Unicode-Zeichen sein. Ich weiß nicht, wie ich mit diesem Problem umgehen soll.

Aktualisierte

Ich verwende folgende Konfiguration

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

Meine DB-Kontextklasse. Ich habe alle Modelle entfernt, nur ein Modell belassen

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

}

Modellklasse

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

Kann mir jemand bei dieser Ausgabe helfen?

Vielen Dank.

16
Shoaib Ijaz

Ich habe den DbConfigurationType von DbContext geändert.

Bekam diesen Link stackoverflow

Jetzt funktioniert es

[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

Wenn Sie ASP.NET Identity verwenden, gibt es drei Stellen, an denen dies geschieht

  1. In der Migrationsverlaufstabelle
  2. Die Name-Eigenschaft von IdentityRole
  3. Die Eigenschaft Username und Email des ApplicationUser

Die meisten Artikel, die ich gefunden habe, haben eine Lösung, die die Länge von Benutzername und E-Mail auf 128 Zeichen reduziert. Ich fand das jedoch nicht akzeptabel, da die offizielle Spezifikation für die E-Mail-Adresse aus 256 Zeichen besteht. 

Meine Lösung war zu:

  1. Deaktivieren Sie Unicode für E-Mail und Benutzername
  2. Überschreiben Sie MySqlMigrationSqlGenerator, und weisen Sie es an, latin1_general_ci collate zu verwenden. Dies ist der Ansi-Zeichensatz.
  3. verkürzen Sie die Länge des Rollennamens. Dies ist akzeptabel, da der Rollenname nicht so lang sein muss
  4. reduzieren Sie die Schlüssellänge für die Verlaufsmigration, wie in verschiedenen Artikeln im Internet beschrieben.

Sie finden meine Lösung unter https://github.com/timdinhdotcom/MySql.AspNetIdentity

5
Tien Dinh

Werfen Sie einen Blick auf diesen Artikel und sehen Sie, ob es hilft. Insbesondere die Klassen MySqlHistoryContext.cs, Configuration.cs und MySqlInitializer.cs wurden hinzugefügt.

Hier finden Sie Ihre Lösung.

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

Verwenden Sie den Konfigurationscode unten ... Dies hat mein Problem gelöst:

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

}
1
Alper Ebicoglu

Es gibt eine einfache Möglichkeit, NVARCHAR-Felder in varchar in MYSQl zu ändern. Fügen Sie diese Zeilen in IdentityModels.cs hinzu

[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

Wenn Sie alle Antworten in diesem Beitrag ausprobiert haben und immer noch den Fehler erhalten, führen Sie diesen Befehl auf dem MySQL-Server aus:

set GLOBAL storage_engine='InnoDb';

Der Fehler wurde hier gemeldet: http://bugs.mysql.com/bug.php?id=4541

0
Pabinator

Sie müssen diesen Link sehen https://stackoverflow.com/a/27082231/929740

  • Hinzufügen des DbConfigurationTypeAttribute zur Kontextklasse: [DbConfigurationType (typeof (MySqlEFConfiguration))]
  • Aufrufen von DbConfiguration.SetConfiguration (new MySqlEFConfiguration ()) beim Start der Anwendung
  • Legen Sie den DbConfiguration-Typ in der Konfigurationsdatei fest:

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

0
Kim Ki Won

Ich bin dieses Problem durch Laufen losgelöst:

Enable-Migrations -EnableAutomaticMigrations -Force -ContextTypeName ApplicationDbContext

Und ohne eine Initialmigration zu erstellen:

Update-Database

Die Tabellen wurden ohne Probleme oder Fehler erstellt

0
Jorge Cuevas