I can't figure out why my latest migration is not getting executed automatically on application startup (or at least on first access of the database context). I used to run update-database manually in development, but I want to test whether it will upgrade automatically on my hosted test environment.
In Application_Start():
Database.SetInitializer<FepazoContext>(
new MigrateDatabaseToLatestVersion<FepazoContext, FepazoConfiguration>())
In FepazoConfiguration:
internal sealed class FepazoConfiguration :
DbMigrationsConfiguration<Fepazo.Models.FepazoContext>
{
public FepazoConfiguration()
{
AutomaticMigrationsEnabled = true;
}
}
I even added this to the constructor of FepazoContext:
public FepazoContext() : base("DefaultConnection")
{
Database.Initialize(false);
}
Some extra information:
__MigrationHistory
table, I can see that the migration is not yet 'recorded' as executed.AutomaticMigrationsEnabled
setting isn't overridden in Web.config file.FepazoContext
constructor and the FepazoConfiguration
are getting hit.Am I forgetting something ? Can I dig deeper to find out where it goes wrong ?
Updates
Passing True
to Database.Initialize
to try and force the migration also has no effect. Database.CompatibleWithModel(true)
returns false - so the system detects there is a difference, however it does not execute the pending migration!
public FepazoContext() : base("DefaultConnection")
{
if (!Database.CompatibleWithModel(true))
{
// This is executed (each time the code enters)
Database.Initialize(true);
}
}
Workaround
As a workaround, I call DbMigrator.Update()
explicitly right after setting the initializer. That does the trick, although I'd still like to know why it doesn't work automatically...
protected void Application_Start()
{
// <...>
Database.SetInitializer<FepazoContext>(
new MigrateDatabaseToLatestVersion<FepazoContext, FepazoConfiguration>());
var dbMigrator = new DbMigrator(new FepazoConfiguration());
dbMigrator.Update();
// <...>
}
According to another answer on here the initializer doesn't run until there is some interaction with the database. The answer explains how to force the initializer to run immediately.