我正在运行代码优先迁移。(英孚 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 上的第一个数据库请求等待迁移发生。
想法?