私のニーズはあなたに似ていたので、私はここに、彼らは他の誰かを助けることができる場合は、それらを文書化するはずと考えました。私の目標は、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を設定します。私のユニットテストは、次のようになりますデバッグの移行を私にとってはるかに簡単にしました!
徹底的な回答ありがとう! – DanielEli
フォローアップ - この制限を回避するために、ファイルベースのロギングヘルパーを、パスなしのファイルに書き込む(つまり、アプリケーションディレクトリに書き込む必要がある)マイグレーション中に呼び出されたメソッド(つまり 'Seed')そのファイルがどこにあるのか知っていますか?パッケージフォルダを調べてみましたが、そこにはありません。 – drzaus
これは非常に醜い回避策ですが、必要な出力を文字列に格納し、シードの最後にデータを含む例外をスローして、コンソールに何らかの出力を得ることができます。これはちょうど迅速かつ汚れた開発者のトリックであることに注意してください。 – Crypth