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