34

在从 EF 4.3 开始的应用程序中执行所有必需的数据库迁移的最佳方法是什么?

4

3 回答 3

54

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

Database.SetInitializer<YourContext>(
    new MigrateDatabaseToLatestVersion<YourContext, YourMigrationsConfig>());
Database.Initialize(false);
于 2012-02-14T21:30:29.293 回答
6

可以在ADO.NET 团队博客上的EF 4.3 配置文件设置中找到有关 EF 4.3 配置选项的详细说明。最后一节描述了数据库初始化程序,包括新的 Code FirstMigrateDatabaseToLatestVersion初始化程序。

MigrateDatabaseToLatestVersion尽管 Entity Framework(与 .NET 4.x 的许多其他功能一样)更倾向于约定而不是配置,但在这种情况下,通过应用程序的配置文件设置数据库初始化程序而不是将其显式编码到应用程序中可能非常有用。

于 2012-02-16T17:40:20.037 回答
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));
    }
}
于 2012-05-24T21:50:32.513 回答