web-dev-qa-db-de.com

EF Core - Tabelle '* .__ EFMigrationsHistory' existiert nicht

Ich möchte betonen, dass dies .NET Core ist und die Threads zu EF 6.0 nicht auf dieses Problem zutreffen

Ich habe mein DbContext erstellt und in DI hinzugefügt. Wenn ich jedoch dotnet ef database update -v mache, möchte ich die Migrationstabelle __EFMigrationsHistory nicht erstellen.

Gibt es einen anderen Befehl, den ich zuerst ausführen sollte, oder ist dies ein Fehler des EF Core MySQL-Adapters?

MainDbContext

using Microsoft.EntityFrameworkCore;
using MySQL.Data.EntityFrameworkCore.Extensions;
using Web.Models;

namespace Web.Infrastructure
{
    public class MainDbContext : DbContext
    {
        public DbSet<User> Users { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseMySQL("connection-string-here");
            base.OnConfiguring(optionsBuilder);
        }
    }
}

Error

DbContext-Klassen finden ...

Verwendung des Kontextes 'MainDbContext'.

Verwendung der Datenbank 'db' auf dem Server 'localhost'.

MySql.Data.MySqlClient.MySqlException: Die Tabelle 'db .__ EFMigrationsHistory' ist nicht vorhanden

Die Tabelle 'db .__ EFMigrationsHistory' ist nicht vorhanden `` `

project.json

{
  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.1",
      "type": "platform"
    },
    "Microsoft.AspNetCore.Diagnostics": "1.0.0",
    "Microsoft.AspNetCore.Mvc": "1.0.1",
    "Microsoft.AspNetCore.Razor.Tools": {
      "version": "1.0.0-preview2-final",
      "type": "build"
    },
    "Microsoft.AspNetCore.Routing": "1.0.1",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.1",
    "Microsoft.AspNetCore.StaticFiles": "1.0.0",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
    "Microsoft.Extensions.Configuration.Json": "1.0.0",
    "Microsoft.Extensions.Logging": "1.0.0",
    "Microsoft.Extensions.Logging.Console": "1.0.0",
    "Microsoft.Extensions.Logging.Debug": "1.0.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
    "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0",
    "BundlerMinifier.Core": "2.2.301",
    "WebMarkupMin.AspNetCore1": "2.2.1",
    "MySql.Data.EntityFrameworkCore": "7.0.6-IR31",
    "Microsoft.EntityFrameworkCore.Design": "1.0.0-preview2-final"
  },
  "tools": {
    "Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview2-final",
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final",
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
  },
  "frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "dotnet5.6",
        "portable-net45+win8"
      ]
    }
  },
  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },
  "runtimeOptions": {
    "configProperties": {
      "System.GC.Server": true
    }
  },
  "publishOptions": {
    "include": [
      "wwwroot",
      "**/*.cshtml",
      "appsettings.json",
      "web.config"
    ]
  },
  "scripts": {
    "prepublish": [ "bower install", "dotnet bundle" ],
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  }
}

Temp Lösung

Durch die Ausführung von dotnet ef migrations script erhalte ich SQL-Code, den ich direkt in MySQL ausführen kann. Danach werden Migrationen erstellt und alles funktioniert normal. Dies ist eine temporäre Lösung, die schlecht ist. Ich frage mich immer noch, was der "richtige" Weg ist, Migrationen zu ermöglichen.

17
stan

Das gleiche Problem bei der Verwendung eines Standard-Oracle-Anbieters aufgetreten.

Entsprechend dieser Frage Das Update der Dot Net Entity Framework-Datenbank erstellt keine Tabellen in der mysql-Datenbank Die Migrationsfunktion wurde noch nicht implementiert.

Ich habe die Vorschläge des SapientGuardian-Anbieters befolgt und scheint nun der beste Weg zu sein.

Edit: Wie in Kommentaren vorgeschlagen, ist Pomelo die beste Option seit Anfang 2018. Ich habe es seit meiner ursprünglichen Antwort anderen Providern ausgesucht.

13
Peuczynski

Den Kommentar von Mark G zu einer Antwort machen.

Nachdem die __EFMigrationsHistory-Tabelle erstellt wurde, sollte der Rest der Aktualisierung ausgeführt werden.

CREATE TABLE `__EFMigrationsHistory` ( `MigrationId` nvarchar(150) NOT NULL, `ProductVersion` nvarchar(32) NOT NULL, PRIMARY KEY (`MigrationId`) );

Alternativ können Sie das Skript Ihrer Migration (en) generieren und mithilfe dieses Befehls in der Package Manager Console manuell auf die Datenbank anwenden:

Script-Migration

Wenn Sie alle Skripts generieren müssen, können Sie diesen Befehl verwenden:

Script-Migration -from 0
22
Derrick

Ich stoße auf dasselbe Problem, der OP-Kontext könnte etwas anders sein, aber hier ist meine Antwort der Vollständigkeit halber. 

Sie können dieses Problem unter anderem durch Folgendes erreichen:

  • Sie erstellen eine Migration und aktualisieren die Datenbank. 
  • Aus irgendeinem Grund löschen Sie Ihre Tabellen (nicht die Datenbank) und versuchen erneut, den Befehl update-databse auszuführen.

In diesem Fall wird der Fehler vom OP gemeldet 

MySql.Data.MySqlClient.MySqlException: Tabelle 'db .__ EFMigrationsHistory' existiert nicht

Die Lösung in diesem Fall ist , die komplette Datenbank zu löschen. Danach wird der Befehl update-databse erfolgreich ausgeführt. 

Ich bin mir nicht sicher, ob es nur mit mysql zu tun hat, aber es geht weiter:

  • Wenn Sie die Tabellen löschen, aber eine vorhandene Datenbank verwenden (die zuvor migriert wurde), gibt der Aktualisierungsbefehl eine Ausnahme aus.
  • Wenn Sie die komplette Datenbank löschen, wird der Aktualisierungsbefehl einwandfrei ausgeführt.
5
Ferox

Hatte dasselbe Problem mit dem offiziellen Oracle MySQL-Provider.

Paket hinzugefügt: Install-Package SapientGuardian.EntityFrameworkCore.MySql Und die Migration hat funktioniert!

0
Daimonion