我的需求与您的相似,所以我想我会在这里记录它们,以防他们可以帮助其他人。我的目标是显示迁移的所有输出,包括作为 Seed 方法的一部分运行的所有 sql。作为此解决方案的副作用,您还可以在代码中看到任何 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);
}
}
接下来确保您的 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() 时,您都会看到所有输出,它使调试迁移对我来说变得非常容易!