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?
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);
}
}
}
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 `` `
{
"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%" ]
}
}
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.
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.
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
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:
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:
Hatte dasselbe Problem mit dem offiziellen Oracle MySQL-Provider.
Paket hinzugefügt: Install-Package SapientGuardian.EntityFrameworkCore.MySql Und die Migration hat funktioniert!