我正在运行代码首次迁移。 (EF 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上向数据库发出第一个请求,等待迁移发生。
思想?