Мои потребности были схожи с вашими, поэтому я решил документировать их здесь на случай, если они могут помочь кому-то еще. Моя цель состояла в том, чтобы отобразить весь вывод миграций, в том числе весь SQL, запущенный как часть метода Seed. Как побочный эффект этого решения, вы также сможете увидеть любое сообщение Debug.Write в вашем коде.
Сначала создайте DebugMigrationsLogger, который будет записывать весь вывод миграции в Debug.WriteLine (спасибо 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);
}
}
Далее убедитесь, что у вас есть подкласс DbMigrationsConfiguration для вашего DbContext:
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();
}
Наконец, установите Database.Log в конструкторе DbContext:
public class MyDbContext : DbContext
{
public MyDbContext()
{
Database.Log = message => Debug.WriteLine(message);
}
}
Теперь, когда вы запускаете MigrateDb_Test (), вы увидите все выходные данные, это значительно облегчило мне отладку миграции!