Mis necesidades eran similares a la suya por lo que pensé que había que documentarlos aquí en caso de que pudieran ayudar a alguien más. Mi objetivo era mostrar todo el resultado de las migraciones, incluida toda la ejecución sql como parte del método Seed. Como efecto secundario de esta solución, también podrá ver cualquier mensaje Debug.Write en su código.
Primero cree un DebugMigrationsLogger que escribirá todos los resultados de la migración en Debug.WriteLine (gracias a 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);
}
}
A continuación asegúrese de que tiene una subclase de DbMigrationsConfiguration para su DbContext:
public class MyDbMigrationsConfiguration : DbMigrationsConfiguration<MyDbContext>
{
public MyDbMigrationsConfiguration()
{
}
protected override void Seed(MartusDb db)
{
//...
}
}
Siguiente ejecutar sus migraciones como una prueba de la unidad a la carta para que su corredor de prueba puede capturar la salida. Mi prueba de la unidad es como la siguiente:
public void MigrateDb_Test()
{
var config = new MyDbMigrationsConfiguration { AutomaticMigrationDataLossAllowed = true };
var migrator = new DbMigrator(config);
var loggingDecorator = new MigratorLoggingDecorator(migrator, new DebugMigrationsLogger());
loggingDecorator.Update();
}
Por último, establezca la database.log en su constructor DbContext:
public class MyDbContext : DbContext
{
public MyDbContext()
{
Database.Log = message => Debug.WriteLine(message);
}
}
Ahora, cada vez que ejecute el MigrateDb_Test(), verá toda la salida, se ¡Ha hecho que las migraciones de depuración me sean mucho más fáciles!
¡Gracias por la respuesta exhaustiva! – DanielEli
Seguimiento: para evitar esta limitación, si agrego un asistente de registro basado en archivos a un método llamado durante la migración (es decir, 'Seed'), que escribe en un archivo sin ruta (lo que significa que debe escribir en el directorio de la aplicación) ¿Sabrías dónde debería terminar ese archivo? Intenté buscar en la carpeta de paquetes, pero no está allí. – drzaus
Me doy cuenta de que esta es una solución bastante fea, pero puede almacenar la salida que necesita en una cadena y lanzar una excepción con los datos al final de su semilla para obtener algún tipo de salida a la consola. Tenga en cuenta que esto es solo un truco de desarrollador rápido y sucio. – Crypth