繁体   English   中英

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

[英]Entity Framework 6 - How to update customer's database with CodeFirst migration

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

我们不能使用自动迁移,因为一个应用程序的一个以上实例可以在同一个数据库上运行,因此如果其中一个实例被更新并因此更改了模型并因此更改了数据库的结构,则其他实例又将其改回,因此它们都不起作用在数据库上。

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

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

您必须使用“迁移到最新版本”策略。 使用此方法,可以在更改模型时自动更新数据库:

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方法,这将节省您的时间。 还有一点需要注意:如果无法自动处理更改,则魔术迁移有时不起作用(使用键进行复杂更改)。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM