2016-10-04 5 views
3

Wixでセットアッププロジェクトを開発中です。マイグレーション.dllファイルを使用してデータベースをインストールしています。セットアッププロジェクトでエンティティフレームワークの最初のマイグレーションを管理します

Migrate.exeを使用して.dllから移行を実行する予定でしたが、新しいバージョンのインストーラが実行された場合(新しい移行で)、データベースを更新する必要があります。 Migrate.exeを使用してすべての移行を一覧表示し、インストールされたデータベースに対して実行されていない移行のみを実行する方法を見つけることができませんでした。

Migrate.exeなどのツールやフレームワークでこの要件を満たす方法がわかっていますが、移行を追跡してデータベースに対して実行されないものだけを実行できますか?

インストーラプロジェクトで提案された機能を実装して動作させることができるはずです。

ありがとうございました。

敬具、 エフゲニーDyulgerov

+0

Entity Framework Code First Migrationについて言及していますか?もしそうなら、タイトルまたは質問自体にそれを追加することは意味をなさないでしょう。 –

+0

はい - 私はそれを追加しました。ありがとう。 –

答えて

0

インストール時に移行スクリプトを実行する必要はありません - あなたのインストーラがそうするためには高すぎる権限が必要になりますし、あなたがアクティブから、システム管理者によって適用され、インストールパッケージの方針に問題があることディレクトリ。

Dbアップグレードもアプリケーションロジックです。私はそれがアプリケーションに属していると信じています。インストーラではありません。

もちろん、wix with custom actionsで行うことができます。しかし、移行に必要なすべてのアセンブリをロードする必要があります。少なくとも、SQLコマンドを実行する必要があります。

アプリの起動時に移行を実行することをおすすめします。

ここでは、仕事をしてくれる人がいます。

  1. あなたは、プロジェクトの開発サイクル中に作成されたN consequtive移行を持っている:まずscatchいくつかのコンテキストすることができます。
  2. Visual StudioのパッケージマネージャコンソールのEFツールを使用することも、直接(ナゲットパッケージに含まれている.exe)を使用して部分的な(更新)移行を作成することもできます。その後、マイグレーション・アセンブリでそれらをコンパイルして、インストーラを使用してアプリと共にクライアントに運ばれるようにします。 。例:;データベース=私の-DB「データソース= \ SQLINSTANCEを-ConnectionString

    アドオンの移行を-Name SomeDbChangeDescription -StartUpProjectName TheCoreProjectWithConfig -ProjectName TheProjectWithMigrations -ConfigurationTypeName "Fully.Qualified.Type.Name.Of.MigrationConfiguration"。 Trusted_Connection = falseは、ユーザーID = XXX;パスワード= XXX」-ConnectionProviderName 『System.Data.SqlClientの』

このスクリプトを使用すると、1デシベルから移行スクリプトを生成していますが、後で複数の上でそれを適用することができますことを忘れないでくださいデータベース - あなたがdb-per-tenantを持っている場合生成時にマイグレーション・スクリプトにハードコードされたDB固有の情報がないため、すべてのデータベースのマイグレーション・スクリプトを同じモデルから生成する必要はありません。

  1. マイグレーションアセンブリをコンパイルして、インストーラ内にあることを確認して、アプリケーションの起動時に読み込まれていることを確認します。

次のコードを(好きなように)変更できます。 dbMigrator.Update()は、適用する必要があるすべての移行スクリプトを適用します.2つの移行が適用されていないアセンブリで10個の移行がある場合は、dbのモデルとすべての移行を比較し、最後の2つだけを適用します。存在しないデータベース名でdbMigrator.Update()メソッドを呼び出すと、初期スクリプトとその他すべての部分的な更新を適用して新しいDBを作成します。

public class DbInitializer : IDbInitializer 
{ 
    private readonly IConnectionStringProvider _connectionStringProvider; 

    public DbInitializer(IConnectionStringProvider connectionStringProvider) 
    { 
     _connectionStringProvider = connectionStringProvider; 
    } 

    public void CreateOrUpdateDb(string dbName) 
    { 
     try 
     { 
      string connectionString = _connectionStringProvider.GetConnectionString(dbName); 
      DbMigrationsConfiguration cfg = CreateMigrationsConfig(connectionString); 
      cfg.CommandTimeout = 900; 
      cfg.AutomaticMigrationsEnabled = false; 
      cfg.AutomaticMigrationDataLossAllowed = false; 
      DbMigrator dbMigrator = new DbMigrator(cfg); 

      var pendingMigrations = dbMigrator.GetPendingMigrations().ToArray(); 
      if(pendingMigrations.Length > 0) 
      { 
       foreach(var pendingMigration in pendingMigrations) 
       { 
        InitializerEventSource.Log.UpgradingDb(dbName, pendingMigration); 
       } 

       dbMigrator.Update(); 
       DbInitializerEventSource.Log.UpgradedDb(dbName); 
      } 
     } 
     catch(MigrationsException exception) 
     { 
      // exception handling 
     } 
     catch(Exception exception) 
     { 
      // exception handling 
     } 
    } 

    private DbMigrationsConfiguration<InitDbContext> CreateMigrationsConfig(string connectionString) 
    { 
     DbMigrationsConfiguration<InitDbContext> cfg = new DbMigrationsConfiguration<InitDbContext> 
      { 
       AutomaticMigrationsEnabled = false, 
       AutomaticMigrationDataLossAllowed = false, 
       MigrationsAssembly = Assembly.Load("TheAssemblyContainingTheMigrations"), 
       MigrationsNamespace = "TheNamespaceWhereTheMigrationsAre", 
       ContextKey = "HardCodedContexKey", 
       TargetDatabase = new DbConnectionInfo(connectionString, _connectionStringProvider.ProviderInvariantName) 
      }; 
     return cfg; 
     }  
} 

UPDATE あなたは別のアプローチに適用することができます -

  1. を開発中に、上記のAddMigrationスクリプトを使用して、代わりにC#の移行スクリプトのSQL移行スクリプトを得るために、-scriptディレクティブを追加します。
  2. WIX Sql Extensionを使用してインストール中に実行します。 The official Sql Extension for Wix Documentation.
関連する問題