0

我正在运行代码优先迁移。(英孚 4.3.1)

我也在运行 Miniprofiler。

我通过 App_Start 上的代码运行我的代码第一次迁移。

我的代码如下所示:

public static int IsMigrating = 0;
    private static void UpdateDatabase()
    {
        try
        {
            if (0 == System.Threading.Interlocked.Exchange(ref IsMigrating, 1))
            {
                try
                {
                    // Automatically migrate database to catch up.
                    Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(new Exception("Checking db for pending migrations.")));
                    var dbMigrator = new DbMigrator(new Ninja.Data.Migrations.Configuration());
                    var pendingMigrations = string.Join(", ", dbMigrator.GetPendingMigrations().ToArray());
                    Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(new Exception("The database needs these code updates: " + pendingMigrations)));
                    dbMigrator.Update();
                    Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(new Exception("Done upgrading database.")));
                }
                finally
                {
                    System.Threading.Interlocked.Exchange(ref IsMigrating, 0);
                }
            }
        }
        catch (System.Data.Entity.Migrations.Infrastructure.AutomaticDataLossException ex)
        {
            Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(ex));
        }
        catch (Exception ex)
        {
            Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(ex));
        }
    }

问题是我的 DbUpdate 即将被调用,然后我的应用程序抛出一个异常,我认为该异常来自应用程序的第一个网页请求。

说:

无法更新数据库以匹配当前模型,因为存在待处理的更改并且自动迁移已禁用。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将 DbMigrationsConfiguration.AutomaticMigrationsEnabled 设置为 true 以启用自动迁移。

问题是我认为我的主页在我的 dbupdate 完成之前触发了 dbcontext 和这个错误。

你将如何解决这个问题?

我应该使用锁等让上下文等待还是有更简单的方法?

更有趣的是,如果我启动和停止应用程序几次,数据库更改就会被推送,错误就会消失......

所以我需要找到一种方法,让 App_Start 上的第一个数据库请求等待迁移发生。

想法?

4

0 回答 0