2012-06-30 12 views
12

NugetなしでDBを移行するには?実稼働環境でVisual Studio with Nugetを使用することはできません。現在のところ、多くの例では、Visual Studioにナゲットを使用する方法しか教えていません。 生成されたDbMigrationクラスの使用方法は?EFコードNigetのない最初のDbMigration

答えて

12

最も簡単な方法は次のとおりです。DbContextを初期化するとき

Database.SetInitializer(
    new MigrateDatabaseToLatestVersion<MyDbContext, 
             MyDbMigrationsConfiguration>()); 

これは、マイグレーションを実行します。

あなたはまた、手動で実行を強制することができ

var migrator = new DbMigrator(new MyMigrationsConfiguration()); 
migrator.Update(); 

(私はあなたにも構成にTargetDatabaseを設定するために持っていると信じていますが、あなたが試すことができます)

2

EF Power Toolsを使用して実行できます。コマンドプロンプトから移行を実行するために使用できるmigrate.exeプログラムがあります(たとえば、ビルド後など)。運用データベースで移行を実行する場合は、Update-Databaseコマンドを使用して移行クラスからSQLスクリプトを生成することもできます。これは、DBAを通過する必要がある場合に非常に便利です。

EF Power ToolsはVisual Studio Galleryで利用でき、オプションでhereもあります。特に、Update-Databaseコマンドについて詳しく説明しているvideoをチェックしてください。

4

をあなたが使用して最新のバージョンに移行することができますWeb.configの設定 - this blog post by Rowan Miller

コードファーストマイグレーションを使用している場合は、MigrateDatabaseToLatestVersion initializを使用して自動的にマイグレーションするようにデータベースを設定できますエル。

<contexts> 
    <context type="Blogging.BlogContext, MyAssembly"> 
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[Blogging.BlogContext, 
MyAssembly], [Blogging.Migrations.Configuration, MyAssembly]], EntityFramework" /> 
    </context> 
</contexts> 

ただ、ここであなたのコンテキストクラスを入れ替える:System.Data.Entity.MigrateDatabaseToLatestVersionが内蔵されてEFに。この設定は、同じアイデアの古いAppSettingsバージョンを更新します。

これは、どの初期化子を使用するのかという質問は実際には設定が1つで、Web.configでこれを実行できるようにしたいと思っています。 。ここで

5

はオプションです:

  1. たちのNuGetパッケージ で船migrate.exeのコマンドラインツールを使用してください。
  2. MigrateDatabaseToLatestVersionイニシャライザは、 と記載されています。
  3. DbMigratorクラス から利用可能なランタイムAPIを使用してください。
0

私は、DbConfigurationクラスや自動移行を有効にすることなく、コード内で明示的に実行される移行を制御する方法を探していました。

だから私は、次の拡張を作成するために管理し、次のような移行を持つ、一例として

public static void RunMigration(this DbContext context, DbMigration migration) 
{    
    var prop = migration.GetType().GetProperty("Operations", BindingFlags.NonPublic | BindingFlags.Instance); 
    if (prop != null) 
    { 
     IEnumerable<MigrationOperation> operations = prop.GetValue(migration) as IEnumerable<MigrationOperation>; 
     var generator = new SqlServerMigrationSqlGenerator(); 
     var statements = generator.Generate(operations, "2008"); 
     foreach (MigrationStatement item in statements) 
      context.Database.ExecuteSqlCommand(item.Sql); 
    } 
} 

を:

public class CreateIndexOnContactCodeMigration : DbMigration 
{ 
    public override void Up() 
    { 
     this.CreateIndex("Contacts", "Code"); 
    } 

    public override void Down() 
    { 
     base.Down(); 
     this.DropIndex("Contacts", "Code"); 
    } 
} 

あなたのDbContextを使ってそれを実行できます。

using (var dbCrm = new CrmDbContext(connectionString)) 
{ 
    var migration = new CreateIndexOnContactCodeMigration(); 
    migration.Up();     
    dbCrm.RunMigration(migration); 
} 
1

もう1つ解決策があります:

Using DB = New SHAContext() 
     If DB.Database.Exists() Then 
      Dim migrator As New DbMigrator(New SHAClassLibrary.Migrations.Configuration()) 
      For Each m In migrator.GetDatabaseMigrations() 
       Try 
        migrator.Update(m) 
       Catch ex As Exception 

       End Try 
      Next 
     End If 
     'DB.test() 
    End Using 
関連する問題