web-dev-qa-db-ja.com

パッケージマネージャーウィンドウで実行されたコードのコンソールまたはデバッグ出力はどこにありますか?

最初に移行でEntityFrameworkコードを使用しています。パッケージマネージャーコンソールから、「update-database」を実行しています。これにより、オーバーライドしたConfiguration.Seed(context)が実行されます。

    protected override void Seed(WebContext context)
    {

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

その出力はどこにありますか?

さらに良いのは、パッケージマネージャーウィンドウに出力を戻す方法を教えてください。

ダン、Thx

46
DanielEli

その出力はどこにありますか?

申し訳ありませんが、簡単な答えは基本的にどこにもありません。

正確には、少なくともパッケージマネージャコンソールではそうではありません。

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

別のVisual Studioをアタッチして、Debug...コマンドを実行しているVisual Studioインスタンスをデバッグすると、Trace...メソッドとupdate-databaseメソッドの出力を確認できます。次に、デバッグVSで、出力ウィンドウに出力を表示できます。

Console.WriteLine("Console Test");

EFに付属するConsole...コマンドラインツールを使用して移行を実行すると、migrate.exeメソッドの出力を確認できます。

enter image description here

パッケージマネージャーウィンドウに出力するにはどうすればよいですか?

私はここにも悪いニュースがあります。簡単な「リフレクタリング」の後です。EF移行の現在の実装では、update-database(または他のコマンド)の実行中にカスタム情報を表示することはサポートされていません。

34
nemesv

Seedメソッドで値をすばやく見つけることができるようにするために使用する簡単なハックは、気になる値を含む例外を単にスローすることです。

throw new Exception(yourValue);

これによりシードがエラーになりますが、例外/値がパッケージマネージャーコンソールに表示されます。

45
George Johnston

SQL印刷コマンドを実行すると、パッケージマネージャーコンソールに書き込まれます。ここに私が使用するヘルパーメソッドがあります:

    /// <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));
    }
15
jhilden

私のニーズはあなたのニーズと似ていたので、他の誰かを助けることができるように、ここでそれらを文書化すると考えました。私の目標は、Seedメソッドの一部としてすべてのSQL実行を含む、移行からのすべての出力を表示することでした。このソリューションの副作用として、コード内のDebug.Writeメッセージ。

最初に、すべての移行出力をDebug.WriteLineに書き込むDebugMigrationsLoggerを作成します( 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);
    }
}

次に、DbContextのDbMigrationsConfigurationのサブクラスがあることを確認します。

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

次に、移行をオンデマンドの単体テストとして実行して、テストランナーが出力をキャプチャできるようにします。私の単体テストは次のようになります:

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

最後に、DbContextコンストラクタでDatabase.Logを設定します。

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

MigrateDb_Test()を実行すると、すべての出力が表示されるので、移行のデバッグが非常に簡単になりました。

8
pwhe23

ジョージの答えを拡張する汚い回避策。

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());
    }
}
1
mirirui