Asp.net

dotnet ef 遷移自動化:檢測遷移的更改

  • July 27, 2017

我使用以下 CLI 進行數據庫遷移:

  1. dotnet ef migrations add <Name-of-Migration>
  2. dotnet ef database update

但是,我正在尋找一種自動發生這種情況的方法:當檢測到模型中的更改時。

到目前為止,我已經能夠通過在 Startup.cs 中執行以下操作來消除第 2 步:

private void SetupDatabase(IApplicationBuilder app)
   {
       using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
       {
           var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
           //Migate any pending changes:
           context.Database.Migrate();
       }
   }

這將遷移通過執行創建的任何待處理更改: dotnet ef migrations add <Name-of-Migration> 但它不會為模型中的任何更改添加遷移。我該如何自動化migrations add呢?

更新:可以移動從程式碼自動生成遷移的第一步,這是我個人不同意的設計決策。正如我最初所說的那樣,它在您的目標 EF7 中仍然是不可能的(它似乎已從 EF7 中刪除,它似乎在此 SO 文章以及Ivan 評論中提到的 Microsoft EF 團隊成員在此部落格文章中提到),但經過測試在馬丁回復後的 EF6 中。第二步可以自動化,因為您也已經發現,所以我不會再重現它。

第一步的步驟如下(在 ASP.net MVC Web Application with EF6 中):

  1. 在您的項目中(應該已經在執行某些模型並處於一致狀態),轉到包管理器控制台並執行Enable-Migrations –EnableAutomaticMigrations. 如果您的應用程序具有單個 DB 上下文,那麼它也已在其中應用了更改。
  2. 現在轉到現有模型並在那裡添加一個新欄位,例如public String TestField { get; set; }
  3. 由於程式碼優先自動遷移是ON,您不需要Add-Migration再次執行命令(希望,正如我在此答案的後面部分中指出的那樣),您只需執行Update-Database並且應該更新數據庫以允許您的應用程序執行良好。

為什麼自動模型更改監視以自動生成和更新數據庫有時可能會適得其反(以我的拙見和來自MSDN 頁面):

  • 根據 MSDN,自動遷移在更改欄位重命名時不起作用。
  • 如果添加原始欄位類型,則需要考慮現有數據,並且在這種情況下您應該考慮手動遷移。
  • 您可以穿插自動和基於程式碼的遷移,但不建議在團隊開發場景中這樣做。如果您是使用原始碼控制的開發人員團隊的一員,您應該使用純自動遷移或純基於程式碼的遷移。鑑於自動遷移的局限性,MSDN 建議在團隊環境中使用基於程式碼的遷移。
  • 很高興確認模型更改是故意的,而不是在進行更改時一些剩餘程式碼的結果,可能發生的事情和自動化完整過程可能會將此類更改轉移到 DB。
  • 由於某些數據限製或類似問題,生成的遷移並不總是優化和/或失敗,因此應該進行審查。
  • 在某些情況下,當遷移正在處理大量數據時,甚至更新數據庫也會為我們的生產數據超時。然後我們必須手動遠端執行它並重新啟動伺服器。

以上可能並不適用於所有人,但我認為應該分享我同意不使遷移生成和應用程序自動化到 DB 的設計決定的原因。

每個考慮啟用自動遷移的人都應該閱讀MSDN 頁面以獲取更多範例和缺點。

引用自:https://stackoverflow.com/questions/45133532