簡體   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