Где я могу найти консольный или отладочный вывод кода, выполненного в окне диспетчера пакетов? - PullRequest
42 голосов
/ 30 марта 2012

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

    protected override void Seed(WebContext context)
    {

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

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

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

Thx, Dan

Ответы [ 5 ]

44 голосов
/ 12 марта 2013

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

throw new Exception(yourValue);

.мое исключение / значение отображается в консоли диспетчера пакетов.

31 голосов
/ 30 марта 2012

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

Извините, но быстрый ответ в основном никуда.

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

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:

enter image description here

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

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

15 голосов
/ 29 октября 2014

Выполнение команды печати 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));
    }
7 голосов
/ 01 мая 2015

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

1 голос
/ 17 июня 2016

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

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());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...