web-dev-qa-db-fra.com

Où puis-je trouver la sortie de la console ou du débogage à partir du code exécuté dans la fenêtre du gestionnaire de packages?

J'utilise d'abord le code EntityFramework avec les migrations. Depuis la console du gestionnaire de paquets, j'exécute "update-database". Ceci exécute Configuration.Seed (contexte) que j'ai remplacé.

    protected override void Seed(WebContext context)
    {

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

Où puis-je trouver cette sortie?

Mieux encore, comment puis-je revenir dans la fenêtre du gestionnaire de paquets?

Thx, Dan

38
DanielEli

Où puis-je trouver cette sortie?

Désolé, mais la réponse rapide est fondamentalement nulle part. 

Pour être précis, du moins pas dans la console du gestionnaire de paquets.

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

Vous pouvez voir le résultat des méthodes Debug... et Trace... si vous attachez un autre Visual Studio pour déboguer l'instance de Visual Studio qui exécute la commande update-database. Ensuite, dans le VS de débogage, vous pouvez voir la sortie dans la fenêtre de sortie.

Console.WriteLine("Console Test");

Vous pouvez voir le résultat des méthodes Console... si vous exécutez les migrations avec l'outil de ligne de commande migrate.exe fourni avec EF:

enter image description here

Comment puis-je revenir dans la fenêtre du gestionnaire de paquets?

J'ai aussi une mauvaise nouvelle, après un "réflecteur" rapide: avec l'implémentation actuelle des migrations EF, il n'est pas possible d'afficher des informations personnalisées pendant l'exécution de la commande update-database (ou de toute autre commande).

29
nemesv

Un hack rapide que j'utilise pour pouvoir trouver rapidement une valeur dans ma méthode Seed consiste simplement à lever une exception avec une valeur qui me tient à cœur, par exemple.

throw new Exception(yourValue);

Cela génère une erreur dans la valeur de départ, mais mon exception/valeur apparaît dans la console du gestionnaire de packages.

44
George Johnston

L'exécution d'une commande d'impression SQL écrit dans la console du gestionnaire de packages. Voici une méthode d'assistance que j'utilise:

    /// <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));
    }
16
jhilden

Mes besoins étaient similaires aux vôtres. J'ai donc pensé les documenter ici au cas où ils pourraient aider quelqu'un d'autre. Mon objectif était d'afficher toutes les sorties des migrations, y compris toutes les exécutions de SQL dans le cadre de la méthode Seed. Comme effet secondaire de cette solution, vous pourrez également voir n’importe quel message Debug.Write dans votre code.

Commencez par créer un DebugMigrationsLogger qui écrira toutes les sorties de migration dans Debug.WriteLine (grâce à 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);
    }
}

Assurez-vous ensuite que vous avez une sous-classe de DbMigrationsConfiguration pour votre DbContext:

public class MyDbMigrationsConfiguration : DbMigrationsConfiguration<MyDbContext>
{
    public MyDbMigrationsConfiguration()
    {
    }
    protected override void Seed(MartusDb db)
    {
        //...
    }
}

Ensuite, vous exécutez vos migrations en tant que test unitaire à la demande afin que votre programme d'exécution de test puisse capturer la sortie. Mon test unitaire ressemble à ceci:

public void MigrateDb_Test() 
{
    var config = new MyDbMigrationsConfiguration { AutomaticMigrationDataLossAllowed = true };
    var migrator = new DbMigrator(config);
    var loggingDecorator = new MigratorLoggingDecorator(migrator, new DebugMigrationsLogger());
    loggingDecorator.Update();
}

Enfin, définissez le fichier Database.Log dans votre constructeur DbContext:

public class MyDbContext : DbContext
{
    public MyDbContext()
    {
        Database.Log = message => Debug.WriteLine(message);
    }
}

Maintenant, chaque fois que vous exécutez MigrateDb_Test (), vous verrez tout le résultat, cela facilite grandement le débogage des migrations!

7
pwhe23

Solution de contournement sale prolongeant la réponse 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());
    }
}
0
mirirui