Где я могу найти вывод консоли или отладки кода, выполняемого в окне диспетчера пакетов?

Сначала я использую код EntityFramework с миграциями. В консоли диспетчера пакетов я запускаю «базу данных обновления». Это выполняет Configuration.Seed(context), который я переопределил.

    protected override void Seed(WebContext context)
    {

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

Где я могу найти этот вывод?

Еще лучше, как мне вывести обратно в окно диспетчера пакетов?

Спасибо, Дэн


person DanielEli    schedule 30.03.2012    source источник


Ответы (5)


Где я могу найти этот вывод?

Извините, но быстрого ответа в принципе некуда.

Если быть точным, по крайней мере, не в консоли диспетчера пакетов.

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

Вы можете увидеть выходные данные методов Debug... и Trace..., если подключите другую Visual Studio для отладки экземпляра Visual Studio, в котором выполняется команда update-database. Затем в отладчике VS вы можете увидеть вывод в окне вывода.

Console.WriteLine("Console Test");

Вы можете увидеть вывод методов Console..., если запустите миграцию с помощью инструмента командной строки migrate.exe, который поставляется с EF:

введите здесь описание изображения

Как вывести обратно в окно диспетчера пакетов?

У меня есть и плохие новости после быстрого «размышления»: с текущей реализацией миграции EF не поддерживается отображение пользовательской информации во время выполнения update-database (или любой другой команды).

person nemesv    schedule 30.03.2012
comment
Последующие действия — чтобы обойти это ограничение, если я добавлю помощник по ведению журнала на основе файла к методу, вызываемому во время миграции (т. е. Seed), который записывает в файл без пути (то есть он должен записывать в каталог приложения), не могли бы вы знаете, где этот файл должен закончиться? Я пытался искать в папке пакетов, но его там нет. - person drzaus; 03.08.2012
comment
Я понимаю, что это довольно уродливый обходной путь, но вы можете сохранить вывод, который вам нужен, в строке и создать исключение с данными в конце вашего семени, чтобы получить какой-то вывод на консоль. Обратите внимание, что это всего лишь быстрый и грязный трюк разработчика. - person Crypth; 11.09.2012

Быстрый хак, который я использую, чтобы иметь возможность быстро найти значение в моем методе Seed, — это просто выдать исключение со значением, которое мне нужно, например.

throw new Exception(yourValue);

Это приводит к ошибке в Seed, но мое исключение/значение появляется в моей консоли диспетчера пакетов.

person George Johnston    schedule 12.03.2013
comment
+1 Никто не должен делать это как предложение - но это оказалось очень полезным для меня - спасибо! - person Nij; 26.07.2013
comment
простота иногда может быть гениальной - person Robert Petz; 26.08.2019

Выполнение команды печати SQL приведет к записи в консоль диспетчера пакетов. Вот вспомогательный метод, который я использую:

    /// <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));
    }
person jhilden    schedule 28.10.2014
comment
Где найти метод Sql? - person Kevin Swarts; 05.12.2014
comment
Это полезно в подклассах DbMigration, но не в классе Configuration, где Sql недоступен. - person Damian Powell; 24.09.2015
comment
Забавно, я не вижу их, когда пробую. @DamianPowell Вы можете добавить еще один внутренний класс внутри Configuration, расширяющий DbMigration, который ничего не делает, кроме добавления предоставленного метода jhilden. - person sproketboy; 10.09.2019

Мои потребности были схожи с вашими, поэтому я решил задокументировать их здесь на случай, если они смогут помочь кому-то еще. Моя цель состояла в том, чтобы отобразить все выходные данные миграции, включая весь запуск 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(), вы видите все выходные данные, это значительно упростило отладку миграций!

person pwhe23    schedule 01.05.2015
comment
Я думаю, что это отличный ответ. Выходные данные доступны как часть результатов теста в окне обозревателя тестов в Visual Studio. Обратите внимание, что класс Configuration, скорее всего, будет внутренним, но вы можете просто добавить [assembly: InternalsVisibleTo(MyUnitTestProject)] к этому классу, чтобы разрешить доступ. - person Craig; 25.01.2018

Грязный обходной путь, расширяющий ответ Джорджа.

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());
    }
}
person mirirui    schedule 17.06.2016
comment
Судя по состоянию вещей в настоящее время, это кажется самым простым способом получения отладочной информации, несмотря на то, что он довольно неприятный. - person MyiEye; 01.02.2019