【问题标题】:Entity framework 4.3 run migrations at application start实体框架 4.3 在应用程序启动时运行迁移
【发布时间】:2012-03-06 02:07:45
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

我需要明确地这样做,因为我使用 uber-context 进行迁移,它是其他迁移的超集。关键是:

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));
    }
}

【讨论】:

    【解决方案2】:

    可以在 ADO.NET 团队博客上的 EF 4.3 Configuration File Settings 找到有关 EF 4.3 配置选项的详细说明。最后一节描述了数据库初始化器,包括新的 Code First MigrateDatabaseToLatestVersion 初始化器。

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

    【讨论】:

    • 在使用配置时,还要注意我对该帖子的评论,以使配置更具可读性。
    【解决方案3】:

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

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

    【讨论】:

    • 这段代码打算放在哪里?不能在 App_Start 中使用 Database.Initialize,因为它不能在静态上下文中使用。
    • @MaximV.Pavlov:尝试将其添加到您的上下文的静态构造函数中。
    • @LadislavMrnka:Database.Initialize(false); 的目的是什么?根据我对MigrateDatabaseToLatestVersion 的测试,数据库在没有第二次 Initialize 调用的情况下被创建、播种并更新到最新版本。 (在 EF5 中...)
    • @demoncodemonkey:它会立即执行数据库初始化。如果您不使用它,初始化将在您的应用程序第一次尝试访问数据库时进行。
    • Initialize() 不是 EF 6.1 中的静态方法。
    猜你喜欢
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 2016-11-18
    • 2016-07-15
    • 2017-07-03
    • 1970-01-01
    相关资源
    最近更新 更多