Где я могу найти консоль или отладить вывод из кода, выполняемого в окне диспетчера пакетов?
Я сначала использую код EntityFramework с миграциями. Из консоли диспетчера пакетов я запускаю "update-database". Это выполняет Configuration.Seed(контекст), который я переопределил.
protected override void Seed(WebContext context)
{
Console.WriteLine("Console Test");
Debug.WriteLine("Debug Test");
Trace.WriteLine("Trace Test");
}
Где я могу найти этот вывод?
Еще лучше, как я могу вернуться в окно диспетчера пакетов?
спасибо,
Dan
Ответы
Ответ 1
Где я могу найти этот вывод?
Извините, но быстрый ответ в основном нигде.
Чтобы быть точным, по крайней мере, не в консоли диспетчера пакетов.
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
(или любой другой команды).
Ответ 2
Быстрый взлом, который я использую, чтобы иметь возможность быстро найти значение в методе Seed, - это просто исключить исключение со значением, которое меня волнует, например.
throw new Exception(yourValue);
Это приводит к ошибке Seed, но мое исключение/значение появляется в моей консоли диспетчера пакетов.
Ответ 3
Запуск команды печати 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));
}
Ответ 4
Мои потребности были похожи на ваши, поэтому я решил, что буду документировать их здесь, если они могут помочь кому-то другому. Моя цель состояла в том, чтобы отобразить все результаты миграции, включая весь процесс 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)
{
//...
}
}
Затем вы запускаете свои миграции как по запросу unit test, чтобы ваш тестовый бегун мог захватить вывод. Мой unit test выглядит примерно так:
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(), вы увидите все выходные данные, это облегчило мне отладочную миграцию!
Ответ 5
Грязное обходное решение, расширяющее ответ Джорджа.
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());
}
}