Debuggen von Code-First-Entity Framework-Migrationscodes


138

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


Es ist nur Standard-C # -Code - also ja, natürlich können Sie darin Haltepunkte setzen .....
marc_s

1
Die Anwendung wird jedoch nicht ausgeführt, da ich die Package Manager-Konsole verwende.
Daniel

1
Aktualisieren Sie dann nicht von der Package Manager-Konsole, sondern legen Sie den Migrationsinitialisierer als Standardinitialisierer fest, damit die Datenbank beim ersten Herstellen einer Verbindung mit Ihrer Anwendung migriert wird.
Wiktor Zychla

Ich aktualisiere meine Datenbank mithilfe des Migrationscodes und kann die App nicht stoppen und erneut ausführen, um den Initialisierer auszuführen.
Daniel

Der Grund, warum ich kein SQL verwende, ist, dass der Code für die Aktualisierung ziemlich kompliziert ist und es fast unmöglich ist, ihn mit SQL zu implementieren.
Daniel

Antworten:


255

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:

if (System.Diagnostics.Debugger.IsAttached == false)
{
    System.Diagnostics.Debugger.Launch();
}

Danach können Sie Ihre InnerException sehen.

Oder Sie können die Anweisung try ... catch wie folgt verwenden: Ausnahmebehandlung Entity Framework


3
Ja, dies funktioniert, während eine Update-Datenbank über die Paketmanagerkonsole ausgeführt wird. Sehr praktisch!
Tom Ferguson

11
Ich habe dies oben in meiner Configuration.Seed-Methode hinzugefügt. Es wird ein Popup angezeigt, in dem Sie Ihr Visual Studio zum Debuggen des Codes auswählen können. Mein System hängt jedoch, wenn ich es auswähle (möglicherweise ohne Bezug).
Talon

3
Wo soll dieser Code abgelegt werden? wenn jemand helfen kann! Vielen Dank.
Aritra B

4
Im Konstruktor Ihrer Konfigurationsklasse.
Casey

5
@Talon Gehen Sie einen Kaffee trinken und als Sie zurück sind, ist wahrscheinlich eine weitere Visual Studio-Instanz aufgetaucht. :)
Corstian Boerman

11

Um einen Haltepunkt bei einer Datenbankmigration zu erreichen, setzen Sie den Kontext bei der Initialisierung auf MigrateDatabaseToLatestVersion.

Database.SetInitializer(new MigrateDatabaseToLatestVersion<EnterContextHere, Configuration>());

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:

Update-Database TargetMigration: ThePreviousMigrationName

8

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.

public void SeedDebug(AppDbContext context)
{
    Seed(context);
}

dann rufe ich in meinem HomeController diese Methode im Debug-Modus auf.

public class HomeController : Controller
{
    var appDb = new AppDbContext();
    public ActionResult Index()
    {
        var config = new Configuration();
        config.SeedDebug(appDb);
        return View();
    }
}

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:

  1. Kommentieren Sie die Seed-Methode und führen Sie die Update-Datenbank aus, um das Modell zu erstellen
  2. Kommentieren Sie die Methode Seed () aus und stecken Sie den oben erwähnten "Hack" ein.

  3. Deaktivieren Sie in der Konfiguration die automatischen Migrationen

    AutomaticMigrationsEnabled = false; // Wenn Sie dies deaktiviert haben, überspringen Sie diesen Schritt bereits

  4. Debuggen Sie Ihre Anwendung, beheben Sie den Fehler und entfernen Sie den "Hack"


5

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:

public partial class ORACLE_Test : DbMigration
{
    public override void Up()
    {
        if (!System.Diagnostics.Debugger.IsAttached)
            System.Diagnostics.Debugger.Launch();

        AddColumn("TEST", "UR_USER_ID", x => x.Decimal(nullable: false, precision: 11, scale: 0, storeType: "number"));
        AddColumn("TEST", "UR_CLIENT_ID", x => x.Decimal(nullable: false, precision: 11, scale: 0, storeType: "number"));
        [...]
    }

    public override void Down()
    {
    }
}

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

migrate.exe "Your.Migrations.Assembly.dll" /scriptFile="foo.sql" /verbose /startupConfigurationFile="Your.Migrations.Assembly.config"

Sobald das Debugger-Auswahldialogfeld angezeigt wird, wählen Sie die Visual Studio-Instanz aus, die Sie bereits geöffnet haben.


4

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.exeDienstprogramm (in pacakges\EntityFramework.x.y.z\tools) ausführen . Sie werden nicht angezeigt, wenn Sie die Migration über die Package Manager-Konsole ausführen.


Danke Tom ... Es war die beste Antwort, die ich bekommen konnte. Wenn niemand dies mit einer besseren Lösung beantwortet, werde ich es als Antwort markieren. :)
Daniel

Oder werfen Sie eine Ausnahme mit Ihrer Nachricht, die Sie zurückgeben möchten.
David d C e Freitas

2

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:

while (!System.Diagnostics.Debugger.IsAttached)
    System.Threading.Thread.Sleep(10);

// Breakpoint after this...

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


An welchen Prozess hängen Sie an?
XDS

-1

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.