34

Estoy usando el código EntityFramework primero con migraciones. Desde la consola del administrador de paquetes, estoy ejecutando "update-database". Esto ejecuta Configuration.Seed (contexto) que he anulado.¿Dónde puedo encontrar la salida de consola o depuración del código ejecutado en la ventana del administrador de paquetes?

protected override void Seed(WebContext context) 
    { 

     Console.WriteLine("Console Test"); 
     Debug.WriteLine("Debug Test"); 
     Trace.WriteLine("Trace Test"); 
    } 

¿Dónde puedo encontrar esa salida?

Mejor aún, ¿cómo devuelvo la salida a la ventana del administrador de paquetes?

Thx, Dan

Respuesta

26

¿Dónde puedo encontrar esa salida?

Lo sentimos, pero la respuesta rápida es básicamente nada.

Para ser preciso al menos no en la consola del administrador de paquetes.

Debug.WriteLine("Debug Test"); 
Trace.WriteLine("Trace Test"); 

Se puede ver la salida de los métodos y Debug...Trace... si adjunta otra Visual Studio para depurar la instancia de Visual Studio que se está ejecutando el comando update-database. Luego, en el depurador VS, puede ver el resultado en la Ventana de salida.

Console.WriteLine("Console Test"); 

Se puede ver la salida de los métodos Console... si ejecuta las migraciones con la herramienta de línea de migrate.exe de comandos que viene con EF:

enter image description here

¿Cómo saco de nuevo a la ventana del administrador de paquetes?

que tengo aquí también malas noticias, después de un "reflectoring" rápida: con la implementación actual de las migraciones EF no está soportado para mostrar información personalizada durante la ejecución de la update-database (o cualquier otro comando).

+0

¡Gracias por la respuesta exhaustiva! – DanielEli

+1

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

+2

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

40

Un truco rápido que uso para poder encontrar rápidamente un valor en mi método de semilla es simplemente lanzar una excepción con un valor que me importa, p.

throw new Exception(yourValue); 

Esto daña la semilla, pero mi excepción/valor aparece en la consola de mi administrador de paquetes.

+7

+1 Nadie debería tener que hacer esa sugerencia, pero me resultó muy útil, ¡gracias! – Nij

14

Al ejecutar un comando de impresión SQL, se escribirá en la consola del Administrador de paquetes. Aquí es un método de ayuda que utilizo:

/// <summary> 
    /// write a message to the Package Manager Console 
    /// </summary> 
    public void Debug(string s, params object[] args) 
    { 
     var fullString = string.Format(s, args).Replace("'", "''"); 
     Sql(string.Format("print '{0}'", fullString)); 
    } 
+5

¿Dónde encuentro el método Sql? –

+0

Eso es útil en las subclases 'DbMigration', pero no en la clase' Configuration' donde 'Sql' no está disponible. –

7

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!

+1

Creo que esta es una gran respuesta. El resultado está disponible como parte de los resultados de la prueba en la ventana del Explorador de pruebas en Visual Studio. Tenga en cuenta que la clase de Configuración probablemente será interna, pero simplemente puede agregar [assembly: InternalsVisibleTo ("MyUnitTestProject")] a esa clase para permitir el acceso. – Craig

-1

Solución sucia que extiende la respuesta de George.

protected override void Seed(YourContext context) 
{ 
    using (var seedout = new StringWriter()) 
    { 
     // do your work 
     context.Authors.AddOrUpdate(x => x.Id, 
      new Author() { Id = 1, Name = "Jane Austen" } 
      ); 

     // some message 
     seedout.WriteLine("some message"); 

     // commit your work 
     context.SaveChanges(); 

     seedout.WriteLine("Seed successfully completed."); 

     // dummy exception to show message on package manager console 
     throw new Exception(seedout.ToString()); 
    } 
} 
Cuestiones relacionadas