我在哪里可以找到包管理器窗口中执行的代码的控制台或调试输出?
Posted
技术标签:
【中文标题】我在哪里可以找到包管理器窗口中执行的代码的控制台或调试输出?【英文标题】:Where can I find the console or debug output from code executed in the package manager window? 【发布时间】:2012-04-14 04:06:36 【问题描述】:我首先使用 EntityFramework 代码进行迁移。从包管理器控制台,我正在运行“更新数据库”。这将执行我已覆盖的 Configuration.Seed(context)。
protected override void Seed(WebContext context)
Console.WriteLine("Console Test");
Debug.WriteLine("Debug Test");
Trace.WriteLine("Trace Test");
在哪里可以找到该输出?
更好的是,如何输出回包管理器窗口?
谢谢, 丹
【问题讨论】:
【参考方案1】:在哪里可以找到该输出?
抱歉,快速回答基本上是无处可去。
确切地说,至少不在包管理器控制台中。
Debug.WriteLine("Debug Test");
Trace.WriteLine("Trace Test");
如果您附加另一个 Visual Studio 以调试运行 update-database
命令的 Visual Studio 实例,您可以看到 Debug...
和 Trace...
方法的输出。然后在debuggin VS的Output Window中就可以看到输出了。
Console.WriteLine("Console Test");
如果您使用
migrate.exe
EF自带的命令行工具:
如何输出回包管理器窗口?
在快速“反思”之后,我这里还有一个坏消息:在当前执行 EF 迁移的情况下,不支持在执行 update-database
(或任何其他命令)期间显示自定义信息。
【讨论】:
Followup - 为了解决这个限制,如果我将基于文件的日志记录帮助程序添加到迁移期间调用的方法(即Seed
),它会写入没有路径的文件(意味着它应该写入应用程序目录),你知道那个文件应该在哪里结束吗?我尝试在包文件夹中查找,但它不存在。
我意识到这是一个非常丑陋的解决方法,但是您可以将所需的输出存储在字符串中,并在种子末尾抛出异常数据,以获得某种输出到控制台.请注意,这只是一个快速而肮脏的开发技巧。【参考方案2】:
我用来快速在我的 Seed 方法中找到一个值的快速技巧就是抛出一个我关心的值的异常,例如
throw new Exception(yourValue);
这会导致 Seed 出错,但我的异常/值出现在我的包管理器控制台中。
【讨论】:
+1 没有人应该提出这个建议 - 但事实证明它对我很有帮助 - 谢谢! 简单有时是天才【参考方案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));
【讨论】:
Sql方法在哪里找? 这在DbMigration
子类中很有用,但在Sql
不可用的Configuration
类中则不然。
有趣的是,我在尝试时没有看到这些。 @DamianPowell 您可以在 Configuration 中添加另一个内部类,扩展 DbMigration,除了添加提供的方法 jhilden 之外什么都不做。【参考方案4】:
我的需求与您的相似,所以我想我会在这里记录它们,以防他们可以帮助其他人。我的目标是显示迁移的所有输出,包括作为 Seed 方法的一部分运行的所有 sql。作为此解决方案的副作用,您还可以在代码中看到任何 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);
接下来确保你的 DbContext 有一个 DbMigrationsConfiguration 的子类:
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();
最后,在 DbContext 构造函数中设置 Database.Log:
public class MyDbContext : DbContext
public MyDbContext()
Database.Log = message => Debug.WriteLine(message);
现在,每当您运行 MigrateDb_Test() 时,您都会看到所有输出,它使调试迁移对我来说变得非常容易!
【讨论】:
我认为这是一个很好的答案。输出在 Visual Studio 的“测试资源管理器”窗口中作为测试结果的一部分提供。请注意,Configuration 类可能是内部的,但您可以简单地将 [assembly: InternalsVisibleTo("MyUnitTestProject")] 添加到该类以允许访问。【参考方案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());
【讨论】:
从目前的情况来看,这似乎是获取调试信息的最简单方法,尽管它相当讨厌。以上是关于我在哪里可以找到包管理器窗口中执行的代码的控制台或调试输出?的主要内容,如果未能解决你的问题,请参考以下文章