2016-10-04 64 views
3

我正在用Wix開發安裝項目,並且我正在使用遷移.dll文件安裝數據庫。在設置項目中管理實體框架代碼第一次遷移

我打算使用Migrate.exe來執行.dll的遷移,但需要運行更新版本的安裝程序(使用較新的遷移),我必須更新數據庫。我找不到用Migrate.exe列出所有遷移的方法,並只運行那些尚未針對已安裝的數據庫運行的遷移。

你知道的方式來實現與Migrate.exe這一要求,或其他任何工具或框架,這將讓我跟蹤遷移和只運行那些不爲數據庫執行的?

我應該能夠實現,以便爲它工作在安裝項目建議的功能。

謝謝。

最好的問候, 葉夫根Dyulgerov

+0

您是指Entity Framework Code First遷移?如果是這樣,那麼在標題或問題本身中添加 –

+0

是的 - 我添加了它。謝謝。 –

回答

0

你不需要在安裝過程中運行遷移腳本 - 您的安裝需要太高的權限這樣做,你可能有安裝由系統管理員從主動應用包策略問題目錄。

Db的升級應用程序邏輯也是一樣,我相信它是屬於應用程序 - 而不是安裝程序。

當然你也可以在wix with custom actions做到這一點。但是你將不得不加載遷移所需的所有程序集 - 至少需要運行SQL命令。

我建議您在應用程序啓動時運行遷移。

這是一個剪裁,完成這項工作。首先讓我們來回顧一下上下文:

  1. 您在項目開發週期中創建了N個連續的遷移。
  2. 您可以使用EF工具從包管理器控制檯在Visual Studio或直接(你可以在NuGet包找到.exe文件)來創建局部(更新)遷移。之後您將在遷移程序集中編譯它們,以便將它們與您的應用程序一起帶到安裝程序的客戶端。舉個例子:。

    添加遷移-Name SomeDbChangeDescription -StartUpProjectName TheCoreProjectWithConfig -ProjectName TheProjectWithMigrations -ConfigurationTypeName 「Fully.Qualified.Type.Name.Of.MigrationConfiguration」 -ConnectionString「數據源= \ SQLINSTANCE;數據庫=我-DB; Trusted_Connection = FALSE;用戶ID = XXX;密碼= XXX」 -ConnectionProviderName‘System.Data.SqlClient的’

記住,使用該腳本您1分貝產生遷移腳本,但以後可以把它在多個數據庫 - 當你有db-per-tenant時。如果源自同一模型,則不需要爲每個數據庫生成遷移腳本,因爲在生成過程中在遷移腳本中沒有硬編碼特定於DB的信息。

  1. 您可以編譯您的遷移程序集並確保它在安裝程序中,並且它在應用程序啓動時加載。

現在您可以使用(隨意修改)以下代碼。 dbMigrator.Update()將應用所有需要應用的遷移腳本 - 如果您在程序集中有10次遷移並且有2次未應用遷移,它將比較db的模型和所有遷移,並將僅應用最後2次遷移。如果使用不存在的數據庫名稱調用dbMigrator.Update()方法,它將創建應用初始腳本和所有其他部分更新的新數據庫。

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腳本,並添加-Script指令獲取SQL遷移腳本,而不是C#遷移腳本。
  2. 使用WIX Sql Extension在安裝過程中執行它。 The official Sql Extension for Wix Documentation.
相關問題