在更新数据库期间有没有办法显示输出?

时间:2014-03-05 19:27:47

标签: c# entity-framework

我正在运行一个相当大的种子作为压力测试,我想知道是否可以向控制台显示输出。

我想显示剩余的条目或完成百分比,或者其他任何内容。

有没有办法在update-database期间写入控制台或包管理器控制台?

3 个答案:

答案 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;的输出调试

顺便提一下,您是否考虑使用NLogLOG4NET将此信息记录到某个文本文件中?

答案 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);
}