wake-up-neo.net

Wo finde ich die Konsolen- oder Debug-Ausgabe von Code, der im Paket-Manager-Fenster ausgeführt wird?

Ich verwende EntityFramework-Code zuerst bei Migrationen. In der Package Manager-Konsole starte ich "update-database". Dadurch wird Configuration.Seed (Kontext) ausgeführt, das ich überschrieben habe.

    protected override void Seed(WebContext context)
    {

        Console.WriteLine("Console Test");
        Debug.WriteLine("Debug Test");
        Trace.WriteLine("Trace Test");
    }

Wo finde ich diese Ausgabe?

Besser noch: Wie gebe ich zurück in das Paket-Manager-Fenster?

Danke, Dan

38
DanielEli

Wo finde ich diese Ausgabe?

Sorry, aber die schnelle Antwort ist im Grunde nirgends. 

Zumindest nicht in der Package Manager Console.

Debug.WriteLine("Debug Test");
Trace.WriteLine("Trace Test");

Sie können die Ausgabe der Methoden Debug... und Trace... sehen, wenn Sie ein anderes Visual Studio anhängen, um die Visual Studio-Instanz zu debuggen, in der der Befehl update-database ausgeführt wird. Im Debuggin-VS sehen Sie dann die Ausgabe im Ausgabefenster.

Console.WriteLine("Console Test");

Sie können die Ausgabe der Console...-Methoden sehen, wenn Sie die Migrationen mit dem Befehlszeilentool migrate.exe ausführen, das im Lieferumfang von EF enthalten ist:

enter image description here

Wie kann ich das Paket-Manager-Fenster wieder ausgeben?

Ich habe hier nach einem kurzen "Reflektoring" auch schlechte Nachrichten: Mit der aktuellen Implementierung der EF-Migrationen wird die Anzeige benutzerdefinierter Informationen während der Ausführung von update-database (oder einem anderen Befehl) nicht unterstützt.

29
nemesv

Ein schneller Hack, mit dem ich schnell einen Wert in meiner Seed- Methode finden kann, besteht einfach darin, eine Ausnahme mit einem Wert auszulösen, der mir wichtig ist, z.

throw new Exception(yourValue);

Dies führt zu einem Fehler im Seed, aber meine Ausnahme/mein Wert wird in meiner Paket-Manager-Konsole angezeigt.

44
George Johnston

Beim Ausführen eines SQL-Druckbefehls wird in die Package Manager Console geschrieben. Hier ist eine Hilfsmethode, die ich verwende:

    /// <summary>
    /// write a message to the Package Manager Console
    /// </summary>
    public void Debug(string s, params object[] args)
    {
        var fullString = string.Format(s, args).Replace("'", "''");
        Sql(string.Format("print '{0}'", fullString));
    }
16
jhilden

Meine Bedürfnisse waren ähnlich wie bei Ihnen, also dachte ich, ich würde sie hier dokumentieren, falls sie jemand anderem helfen könnten. Mein Ziel war es, alle Ausgaben der Migrationen anzuzeigen, einschließlich aller SQL-Anweisungen, die als Teil der Methode Seed ausgeführt werden. Als Nebeneffekt dieser Lösung können Sie auch jede Debug.Write-Nachricht in Ihrem Code sehen.

Erstellen Sie zunächst einen DebugMigrationsLogger, der die gesamte Migrationsausgabe in Debug.WriteLine schreibt (Dank an http://whiteknight.github.io/2013/01/26/efcodeonlymigrations.html ):

public class DebugMigrationsLogger : System.Data.Entity.Migrations.Infrastructure.MigrationsLogger
{
    public override void Info(string message)
    {
        Debug.WriteLine(message);
    }
    public override void Verbose(string message)
    {
        Debug.WriteLine(message);
    }
    public override void Warning(string message)
    {
        Debug.WriteLine("WARNING: " + message);
    }
}

Stellen Sie als Nächstes sicher, dass Sie eine Unterklasse von DbMigrationsConfiguration für Ihren DbContext haben:

public class MyDbMigrationsConfiguration : DbMigrationsConfiguration<MyDbContext>
{
    public MyDbMigrationsConfiguration()
    {
    }
    protected override void Seed(MartusDb db)
    {
        //...
    }
}

Als Nächstes führen Sie Ihre Migrationen als On-Demand-Komponententest aus, damit Ihr Testläufer die Ausgabe erfassen kann. Mein Gerätetest sieht ungefähr so ​​aus:

public void MigrateDb_Test() 
{
    var config = new MyDbMigrationsConfiguration { AutomaticMigrationDataLossAllowed = true };
    var migrator = new DbMigrator(config);
    var loggingDecorator = new MigratorLoggingDecorator(migrator, new DebugMigrationsLogger());
    loggingDecorator.Update();
}

Legen Sie zuletzt das Database.Log in Ihrem DbContext-Konstruktor fest:

public class MyDbContext : DbContext
{
    public MyDbContext()
    {
        Database.Log = message => Debug.WriteLine(message);
    }
}

Wenn Sie nun MigrateDb_Test () ausführen, sehen Sie die gesamte Ausgabe. Das macht das Debuggen von Migrationen für mich so viel einfacher.

7
pwhe23

Schmutziger Workaround, der Georges Antwort erweitert.

protected override void Seed(YourContext context)
{
    using (var seedout = new StringWriter())
    {
        // do your work
        context.Authors.AddOrUpdate(x => x.Id,
            new Author() { Id = 1, Name = "Jane Austen" }
            );

        // some message
        seedout.WriteLine("some message");

        // commit your work
        context.SaveChanges();

        seedout.WriteLine("Seed successfully completed.");

        // dummy exception to show message on package manager console
        throw new Exception(seedout.ToString());
    }
}
0
mirirui