我正在运行一个相当大的种子作为压力测试,我想知道是否可以向控制台显示输出。
我想显示剩余的条目或完成百分比,或者其他任何内容。
有没有办法在update-database期间写入控制台或包管理器控制台?
答案 0 :(得分:6)
有没有办法写入控制台或包管理器控制台 在更新数据库期间?
我将介绍两种可供您开箱即用的选项:
<强> 1。 Console.WriteLine
解决方案:
如果您从控制台应用程序或任何其他应用程序类型的库(例如asp.net)运行代码,则可以使用{ {1}}函数,但主要问题是Console.WriteLine
输出是否有侦听器。
如果没有任何内容正在收听控制台,请利用 Console
Windows API功能打开 侦听器 :
Win32.AllocConsole()
<强>用法:强>
using System.Runtime.InteropServices;
[DllImport("kernel32")]
static extern bool AllocConsole();
考虑使用以下指令包装上述代码,以避免在生产环境中出现意外的痛苦:
AllocConsole();
//now you can call: Console.WriteLine();
Console.WriteLine("Total number of records left to seed:{0}", total);
<强>解释强>
AllocConsole初始化标准输入,标准输出和标准 新控制台的错误句柄。标准输入句柄是 处理控制台的输入缓冲区,以及标准输出和 标准错误句柄是控制台屏幕缓冲区的句柄。至 检索这些句柄,使用GetStdHandle函数。
<强> 2。 #if DEBUG
#endif
解决方案:
在调试模式下使用Debug.Print
功能。使用它,您可以将任何想要的内容写入Visual Studio的DEBUG输出窗口:
调试 - &gt; Windows - &gt;输出 - &gt;显示 - &gt;的输出调试强>
答案 1 :(得分:1)
如果我理解你的话,你需要添加标志&#39; -Verbose&#39;更新数据库命令:
update-database -Verbose
答案 2 :(得分:0)
如果您可以从自定义应用程序运行更新,那么使用EF 6.0拦截的一种hackish解决方案。
public class Program
{
static void Main(string[] args)
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<DatabaseEntities, Configuration>());
using (var entities = new DatabaseEntities())
{
entities.Database.Initialize(true);
}
Console.Read();
}
public class ProgressInterceptor : IDbCommandInterceptor
{
private int currentRecord = 0;
public int TotalCount { get; set; }
public void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
{
}
public void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
{
}
public void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
{
Console.WriteLine("Progress {0:P}", ++currentRecord / (double)TotalCount);
}
public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
{
}
public void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
{
}
public void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
{
}
}
}
种子方法:
protected override void Seed(EfProgress.DatabaseEntities context)
{
var interceptor = new EfProgress.Program.ProgressInterceptor() { TotalCount = 10 };
DbInterception.Add(interceptor);
for (int i = 0; i < 10; i++)
{
var entity = context.EntitySet.Create();
entity.Property1 = "entity " + i;
context.EntitySet.Add(entity);
}
context.SaveChanges();
DbInterception.Remove(interceptor);
}