我首先使用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, 丹
答案 0 :(得分:44)
我用来快速查找Seed方法中的值的快速黑客只是抛出一个我关心的值的异常,例如。
throw new Exception(yourValue);
这会导致种子错误,但我的异常/值会显示在我的包管理器控制台中。
答案 1 :(得分:30)
我在哪里可以找到输出?
很抱歉,但快速回答基本上无处可去。
确切地说,至少不在包管理器控制台中。
Debug.WriteLine("Debug Test");
Trace.WriteLine("Trace Test");
如果您附加另一个Visual Studio来调试运行Debug...
命令的Visual Studio实例,则可以看到Trace...
和update-database
方法的输出。然后在调试器VS中,您可以在输出窗口中看到输出。
Console.WriteLine("Console Test");
如果使用。运行迁移,则可以看到Console...
方法的输出
EF附带的migrate.exe
命令行工具:
如何输出回包管理器窗口?
在快速“反思”之后,我在这里也有坏消息:在EF迁移的当前实现中,不支持在执行update-database
(或任何其他命令)期间显示自定义信息。
答案 2 :(得分:16)
运行SQL print命令将写入Package Manager控制台。这是我使用的辅助方法:
/// <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));
}
答案 3 :(得分:7)
我的需求与你的相似,所以我想我会在这里记录下来,以防他们可以帮助别人。我的目标是显示迁移的所有输出,包括作为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(),您都会看到所有输出,它使我的调试迁移变得更加容易!
答案 4 :(得分:0)
肮脏的解决方法扩展了乔治的答案。
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());
}
}