实体框架4.3在应用程序启动时运行迁移

时间:2012-02-14 17:28:02

标签: .net entity-framework migration ef-migrations entity-framework-4.3

使用EF 4.3在应用程序启动时执行所有必需的数据库迁移的最佳方法是什么?

3 个答案:

答案 0 :(得分:53)

最好的方法是使用新的MigrateDatabaseToLatestVersion初始化程序。

Database.SetInitializer<YourContext>(
    new MigrateDatabaseToLatestVersion<YourContext, YourMigrationsConfig>());
Database.Initialize(false);

答案 1 :(得分:6)

可以在ADO.NET团队博客的EF 4.3 Configuration File Settings找到有关EF 4.3配置选项的精彩描述。最后一节介绍了数据库初始化程序,包括新的Code First MigrateDatabaseToLatestVersion初始化程序。

尽管Entity Framework与.NET 4.x的许多其他功能相比,它们优于配置,但这是一种通过应用程序的配置文件设置MigrateDatabaseToLatestVersion数据库初始化程序非常有用的情况。而不是显式编码到您的应用程序中。

答案 2 :(得分:4)

我需要明确地这样做,因为我使用超级上下文进行迁移,这是其他迁移的超集。关键位是:

var dbMigrator = new System.Data.Entity.Migrations.DbMigrator(
    new Lcmp.EF.Migrations.Migrations.Configuration());
dbMigrator.Update();

随着Elmah日志的记录,我实际上使用了这个,从Application_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 System.Data.Entity.Migrations.DbMigrator(new Lcmp.EF.Migrations.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));
    }
}