Ich verwende zuerst Entity Framework-Code auf meiner Website und frage mich nur, ob es eine Möglichkeit gibt, die Migrationscodes zu debuggen. Sie wissen, wie das Setzen von Haltepunkten und ähnliches.
Ich verwende Package Manager Console, um die Datenbank mit zu aktualisieren Update-Database
.
Vielen Dank
Antworten:
Ich weiß, dass EF Code First Migrations ein relativ neues Tool ist, aber vergessen Sie nicht, dass Sie sich noch in .NET befinden.
So können Sie verwenden:
Danach können Sie Ihre InnerException sehen.
Oder Sie können die Anweisung try ... catch wie folgt verwenden: Ausnahmebehandlung Entity Framework
quelle
Um einen Haltepunkt bei einer Datenbankmigration zu erreichen, setzen Sie den Kontext bei der Initialisierung auf MigrateDatabaseToLatestVersion.
Dann debuggen Sie einfach wie gewohnt (mit f5 ausführen) und der Haltepunkt wird beim ersten Ausführen des Projekts erreicht.
Das Problem ist jetzt, dass die Migration nicht ausgeführt wird, wenn Sie ein zweites Mal debuggen. Dies liegt daran, dass die Tabelle __MigrationHistory aktualisiert wurde, um anzuzeigen , dass Sie auf die neueste Version migriert sind. Um die Migration erneut zu testen, öffnen Sie die Paketmanagerkonsole und führen Sie ein Downgrade auf die vorherige Migration durch:
quelle
Meine Antwort mag ein bisschen albern sein, aber hier geht es trotzdem. Wenn Sie wie ich manchmal Probleme mit der Seed () -Methode haben, erstelle ich einfach eine öffentliche Methode, die Protect Seed () aufruft.
dann rufe ich in meinem HomeController diese Methode im Debug-Modus auf.
Ich weiß, dass es eine etwas lahme Lösung ist, aber es ist einfach und schnell. Dies muss natürlich nach der Erstellung des Modells erfolgen. Also Schritt für Schritt:
Kommentieren Sie die Methode Seed () aus und stecken Sie den oben erwähnten "Hack" ein.
Deaktivieren Sie in der Konfiguration die automatischen Migrationen
AutomaticMigrationsEnabled = false; // Wenn Sie dies deaktiviert haben, überspringen Sie diesen Schritt bereits
Debuggen Sie Ihre Anwendung, beheben Sie den Fehler und entfernen Sie den "Hack"
quelle
Hier ist eine ausfallsichere Methode, die den Trick ohne viel Aufhebens erledigt:
Schritt 1: Platzieren Sie diesen Code direkt über der Migration, die Sie debuggen möchten:
Schritt 2: Kompilieren Sie das Projekt mit Ihren Migrationen
Schritt 3: Öffnen Sie eine Konsole im Ausgabeverzeichnis (/ bin / Debug, / bin / Release usw.), die die DLL Ihrer Migrationen enthält
Schritt 4: Rufen Sie migrate.exe mit dem Parameter / scriptFile auf, um den Debugger zu starten und die gewünschte Datenbankmigration tatsächlich zu debuggen
Sobald das Debugger-Auswahldialogfeld angezeigt wird, wählen Sie die Visual Studio-Instanz aus, die Sie bereits geöffnet haben.
quelle
Sie können dem Migrationscode Console.WriteLine-Anweisungen hinzufügen (keine gute Lösung).
Beachten Sie, dass die Meldungen nur angezeigt werden, wenn Sie den Migrationscode mit dem
migrate.exe
Dienstprogramm (inpacakges\EntityFramework.x.y.z\tools
) ausführen . Sie werden nicht angezeigt, wenn Sie die Migration über die Package Manager-Konsole ausführen.quelle
Ich hatte viel Glück mit "Debugger.Launch ()" (wie in der obigen Antwort von m_david) an anderer Stelle, aber innerhalb von CreateDbContext scheint es irgendwie sowohl anzuhängen als auch nicht anzuhängen. Was ich meine ist, es hängt an und versucht zu versuchen, in .asm-Dateien und .cpp-Dateien (interner Code) zu gelangen. Wenn ich versuche, einen Haltepunkt auf einer Console.Writeline festzulegen, von der ich weiß, dass sie anschließend ausgeführt wird (ich kann die Ausgabe von JEDEM "dotnet ef migrations COMMAND" sehen), wird sie beide ausgeführt und erreicht niemals den Haltepunkt.
Das hat stattdessen bei mir funktioniert:
Sie können die Migration ausführen und fügen manuell Visual Studio verwenden und es wird Sie tatsächlich Schritt durch den Code lassen , wie Sie erwarten, es ist nur mehr Schmerz. Was ich wirklich versuchen sollte, ist die Kombination beider Methoden ...
quelle
Ich habe hier auch einen tollen Trick gefunden , um die Fehlerdetails zu erhalten ...
Grundsätzlich besteht der Trick darin, alle Informationen aus einer Ausnahme abzurufen, in eine Zeichenfolge einzufügen und eine neue DbEntityValidationException mit der generierten Zeichenfolge und der ursprünglichen Ausnahme auszulösen.
quelle