2016-05-31 6 views
0

私のチームは、お客様のシステムでMSSQLデータベースを展開するアプリケーションを開発しています。移行を使用して顧客のデータベース構造を更新する際に問題が発生しました。Entity Framework 6 - CodeFirst移行を使用してお客様のデータベースを更新する方法

複数のインスタンスが同じデータベース上で実行できるため、インスタンスの1つが更新され、モデルが変更され、データベースの構造が変更された場合、他のインスタンスは変更されないため自動移行は使用できませんそれらのデータベースはデータベース上で動作することができます。

更新データベースコマンドを実行するための顧客のデータベースへのアクセス権がないため、非自動移行は使用できません。

問題は、コードレベルでデータベースとモデルを常に最新の状態に保つための最良の方法です。

答えて

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

あなたはすべてを行う必要がありますが、MySQLを使用している問題MS SQL Serverのに


を使用している場合、これが正常に動作しますあなたの自己によって!:

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これはあなたの時間を安全に使用してください。 ワンノート詳細:変更を自動的に処理できない場合、魔法の移行が機能しないことがあります(複雑なキー変更)。

また、対象バージョンへの移行を使用することができますあなたの場合は

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

バージョンをターゲットにするの移行を必要としています。デシレータに を追加すると、移行中に移行スクリプトを変更できます。

+0

私たちはMSSQLを使用しています。私たちは同じイニシャライザ設定を持っていますが、これはまさに問題です。 2つのバージョンのアプリが同じ設定を使って同じデータベースを使用している場合、構造の変更は継続されます。私たちはそれを使うことができますが、古いバージョンを使用している古いバージョンに、データベースの変更を開始する前に強制的に更新する方法が必要です。問題は、変更を開始せずにどのバージョンのDBが古いかを知る方法が見つからないということです。 – SebOlens

+0

私は答えを更新しました。これが問題をスローするのに役立ちます。 donotは投票するのを忘れて^^ –

+0

まだ同じです...もしアプリケーションの1つのインスタンス(バージョン1.0と言う)が最新の移行 "a"と2番目のインスタンス(新しく更新されたバージョン2.0としましょう)に "b"両者は同じ時間に同じデータベース上で動作し、どちらも移行に変更しようとします。私は正しい? データベース内の最新の移行を確認する方法はありますか?また、アプリのスキームが構造に一致しない場合は、アプリの最新のアップデートをダウンロードするよう強制されますか? – SebOlens

関連する問題