实体框架6 - 如何使用CodeFirst迁移更新客户的数据库

时间:2016-05-31 15:23:28

标签: database entity-framework deployment

我的团队开发了一个在客户系统中部署MSSQL数据库的应用程序。我们在使用迁移来更新客户的数据库结构时遇到了问题。

我们无法使用自动迁移,因为应用程序的多个实例可以在同一个数据库上运行,因此,如果其中一个实例得到更新,从而更改了模型,从而更改了数据库的结构,其他实例也将其更改为他们都不能在数据库上工作。

我们无法使用非自动迁移,因为我们无法访问客户的数据库来运行update-database命令。

问题是保持数据库和模型在代码级别始终保持最新的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

您必须使用迁移到最新版本策略。此apporach允许您在模型更改时自动更新数据库:

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, MyMagicDatabaseConfiguration>()`);
 public class MyMagicDatabaseConfiguration : DbMigrationsConfiguration<MyDbContext>
  {
    public MyMagicDatabaseConfiguration()
    {
      this.AutomaticMigrationsEnabled = true;
      this.AutomaticMigrationDataLossAllowed = true;
    }
  }

// !!Force the initialization. this will execute the update!!
MyDb.Context.Database.Initialize(true); 

如果您使用MS SQL Server

,这可以正常工作

你正在使用MySql的问题,你必须自己做所有事情!:

   var migrator = new DbMigrator(new DbMigrationsConfiguration  ());

   migrator.Update();

   // In the migrtaions directory:

   public partial class MyMigration : DbMigration
   {
     public override void Up()
     {
        AddColumn("dbo.MyTable", "AnyName", c => c.Boolean(nullable: false));
     }
     public override void Down()
     {
       DropColumn("dbo.MyTable", "AnyName");
     }
   }

这不是一项简单的工作,我不建议你这样做。只需使用SQL Server apporach,这将安全的时间。 还有一点需要注意:如果无法自动处理更改,则Magic迁移有时无法正常工作(使用键进行复杂更改)。

您还可以使用迁移到目标版本:

 var configuration = new DbMigrationsConfiguration();
      var migrator = new DbMigrator(configuration);

      migrator.Update("HereMigrationId");
      var scriptor = new MigratorScriptingDecorator(migrator);
      var migrationScript = scriptor.ScriptUpdate(sourceMigration: null, targetMigration: "HereMigrationId");

在您的情况下,您需要迁移到目标版本。 使用decrator,您可以在迁移期间修改迁移脚本。