34

私は、まずEntityFrameworkコードを使用しています。パッケージマネージャコンソールから、私は "update-database"を実行しています。これにより、私がオーバーライドしたConfiguration.Seed(コンテキスト)が実行されます。パッケージマネージャウィンドウで実行されるコードのコンソール出力またはデバッグ出力はどこにありますか?

protected override void Seed(WebContext context) 
    { 

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

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

さらに、パッケージマネージャウィンドウにどのように出力するのですか?

Thxを、 ダン

答えて

26

どこでその出力を見つけることができますか?

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

正確には、少なくともパッケージマネージャコンソールには表示されません。

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

あなたがupdate-databaseのコマンドを実行しているVisual Studioのインスタンスをデバッグする別のVisual Studioを添付する場合は、Debug...Trace...メソッドの出力を見ることができます。デバッグVSでは、出力ウィンドウに出力が表示されます。

Console.WriteLine("Console Test"); 

あなたはEFが付属しています migrate.exeコマンドラインツールを使用してマイグレーションを実行する場合は、Console...メソッドの出力を見ることができます:

に戻ってI出力を行う方法enter image description here

パッケージマネージャウィンドウ?

私がここに持っても、悪いニュースは、迅速な「reflectoring」の後:update-database(または任意の他のコマンド)の実行中にカスタム情報を表示するには、サポートされていないEFの移行の現在の実装で。

+0

徹底的な回答ありがとう! – DanielEli

+1

フォローアップ - この制限を回避するために、ファイルベースのロギングヘルパーを、パスなしのファイルに書き込む(つまり、アプリケーションディレクトリに書き込む必要がある)マイグレーション中に呼び出されたメソッド(つまり 'Seed')そのファイルがどこにあるのか知っていますか?パッケージフォルダを調べてみましたが、そこにはありません。 – drzaus

+2

これは非常に醜い回避策ですが、必要な出力を文字列に格納し、シードの最後にデータを含む例外をスローして、コンソールに何らかの出力を得ることができます。これはちょうど迅速かつ汚れた開発者のトリックであることに注意してください。 – Crypth

40

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

throw new Exception(yourValue); 

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

+7

+1誰もそれを提案する必要はありませんが、私にとっては非常に有益でした。 – Nij

14

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)); 
    } 
+5

Sqlメソッドはどこにありますか? –

+0

これは 'DbMigration'サブクラスでは役に立ちますが、' Sql'が利用できない 'Configuration'クラスでは役に立ちません。 –

7

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

まず、すべての移行出力をDebugに書き込むDebugMigrationsLoggerを作成します。WriteLineメソッド(http://whiteknight.github.io/2013/01/26/efcodeonlymigrations.htmlのおかげで):あなたは、テストランナーので、オンデマンドのユニットテストとして、あなたの移行を実行する

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

次へ:

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のサブクラスを持っていることを確認してください出力をキャプチャできます。 、それをあなたがMigrateDb_Testを(実行するたびに今

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

)あなたはすべての出力が表示されます。

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を設定します。私のユニットテストは、次のようになりますデバッグの移行を私にとってはるかに簡単にしました!

+1

これはすばらしい答えだと思います。出力はVisual Studioのテストエクスプローラウィンドウでテスト結果の一部として使用できます。 Configurationクラスは内部にある可能性が高いことに注意してください。アクセスを許可するには、[assembly:InternalsVisibleTo( "MyUnitTestProject")]をそのクラスに追加するだけです。 – Craig

-1

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

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()); 
    } 
} 
関連する問題