112

Ich verwende Entity Framework-Code zuerst auf meiner Website und ich frage mich nur, ob es eine Möglichkeit gibt, die Migrationscodes zu debuggen. Du weißt schon, wie man Haltepunkte setzt und solche Sachen.Debug-Code-zuerst Entity Framework-Migrationscodes

Ich verwende Package Manager Console, um die Datenbank mit Update-Datenbank zu aktualisieren.

Dank

+0

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

+0

aber die Anwendung läuft eigentlich nicht seit ich verwende die Package Manager Console. – Daniel

+1

Führen Sie dann kein Upgrade von der Package Manager-Konsole durch, sondern legen Sie den Migrationsinitialisierer als Standardinitialisierer fest, damit die Datenbank bei der ersten Verbindung mit Ihrer Anwendung migriert wird. –

Antwort

4

Sie Console.WriteLine Aussagen zum Migrationscode hinzufügen könnte (nicht eine große Lösung)

Hinweis, werden die Nachrichten nur, wenn Sie die Migration Code mit dem migrate.exe-Dienstprogramm (in pacakges\EntityFramework.x.y.z\tools laufen gezeigt). Sie werden nicht angezeigt, wenn Sie die Migration über die Package Manager-Konsole ausführen.

+0

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

+0

Oder werfen Sie eine Ausnahme mit Ihrer Nachricht, die Sie zurückgeben möchten. –

216

Ich weiß, dass EF Code First Migrations ist relativ neues Werkzeug, aber vergessen Sie nicht, dass Sie immer noch in .NET sind.

So können Sie verwenden:

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

Danach können Sie Ihr Innerexception sehen können.

Oder Sie verwenden versuchen ... catch-Anweisung wie folgt aus: Exception handling Entity Framework

+0

Thx m_david. Ich hatte keine Zeit, das zu testen. Ich habe ein Android-Projekt abgeschlossen. Ich werde das testen, wenn ich Zeit habe, zu meiner MVC-Website zurückzukehren. – Daniel

+2

Ja, dies funktioniert während der Ausführung einer Update-Datenbank über die Paketmanagerkonsole. Sehr praktisch! –

+9

Ich habe dies am Anfang meiner Configuration.Seed-Methode hinzugefügt. Es verursacht ein Popup, mit dem Sie Ihr Visual Studio auswählen können, um den Code zu debuggen. Mein System hängt jedoch, wenn ich es auswähle (vielleicht nicht verwandt). – Talon

12

einen Haltepunkt in einer db Migration treffen gesetzt, den Kontext zu MigrateDatabaseToLatestVersion auf initialisieren.

Dann debuggen Sie nur als normal (mit f5) und der Breakpoint wird beim ersten Start des Projekts getroffen.

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 zu bestätigen, dass Sie auf die neueste Version migriert haben. Zum erneuten Test öffnet die Migration die Paket-Manager-Konsole und Herabstufung auf die vorherige Migration:

Update-Database –TargetMigration: ThePreviousMigrationName 
+0

Gute Lösung, danke! – magnattic

+0

Das funktionierte auch für mich. Vielen Dank! –

8

Meine Antwort ist vielleicht ein bisschen dumm, aber trotzdem geht es hier. Wenn Sie, wie ich, manchmal Probleme in der Seed() -Methode haben, was ich normalerweise tue, erstellen Sie einfach eine öffentliche Methode, die Protect Seed() aufruft.

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

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

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

Ich weiß, es ist ein bisschen lahme Lösung, aber es ist einfach und schnell. Natürlich muss dies nach der Erstellung des Modells geschehen. So Schritt für Schritt:

  1. Kommentar der Samen Methode und führen Sie die Update-Datenbank das Modell
  2. uncomment der Methode Seed() und Plugin den "Hack" Ich erwähnte oben zu schaffen.

  3. in der Konfiguration deaktivieren Auto-Migrationen

    AutomaticMigrationsEnabled = false; // wenn Sie diese deaktiviert haben dies bereits Ihre Anwendung

  4. Debug Schritt überspringen, beheben Sie den Fehler, und entfernen Sie die "Hack"

0

ich fand auch einen netten Trick here die Fehlerdetails zu erhalten ...

Der Trick besteht darin, alle Informationen aus einer Exception zu übernehmen, sie in eine Zeichenfolge einzufügen und eine neue DbEntityValidationException mit der generierten Zeichenfolge und der ursprünglichen Ausnahme auszulösen.

0

Ich hatte viel Glück mit "Debugger.Launch()" (wie in m_david's answer above) an anderer Stelle, aber innerhalb von CreateDbContext scheint es irgendwie sowohl anhängen, und nicht anhängen. Was ich meine ist, es hängt an und beginnt mit dem Versuch, in .asm-Dateien und .cpp-Dateien (interner Code) zu gehen. Wenn ich versuche, einen Haltepunkt auf einer Console.Writeline, die ich kenne, wird später ausgeführt (ich kann die Ausgabe von jeder "dotnet ef Migrations COMMAND") zu setzen, es führt beide es und trifft nie den Haltepunkt.

Dies ist, was stattdessen für mich gearbeitet:

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

// Breakpoint after this... 

Sie die Migration durchführen können und fügen Sie manuell mit Visual Studio und es wird tatsächlich lassen Sie Schritt durch den Code, wie Sie erwarten, es ist nur eher ein Schmerz. Was ich wirklich versuchen sollte, ist die Kombination beider Methoden ...