46

最初に移行で 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、ダン

4

5 に答える 5

48

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

throw new Exception(yourValue);

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

于 2013-03-12T16:47:25.100 に答える
35

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

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

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

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

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

Console.WriteLine("Console Test");

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

ここに画像の説明を入力

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

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

于 2012-03-30T19:28:32.200 に答える
17

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));
    }
于 2014-10-28T21:51:57.560 に答える
8

私のニーズはあなたのニーズと似ていたので、他の誰かを助けることができる場合に備えて、ここにそれらを文書化することにしました. 私の目標は、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() を実行するたびに、すべての出力が表示されるようになりました。これにより、移行のデバッグが非常に簡単になりました。

于 2015-05-01T16:40:44.323 に答える