9

我使用DB遷移以下CLI變化:DOTNET EF遷移自動化:檢測用於遷移

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

不過,我正在尋找一種方式要做到這一點自動:檢測到模型發生變化時。

到目前爲止,我已經能夠消除步驟2將在做Startup.cs如下:

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

+0

嗯,繼這一個。 – user3581203

+0

由於某種原因,以前的版本無法通過腳本運行(至少在忽略更改的情況下) –

+0

EF7中不可能至少自動生成遷移(在我們以前使用過的EF6中沒有看到過)。我認爲這是EF團隊的一個設計決定,可以理解爲imo。 – Hassan

回答

11

已更新: 可以自動從代碼中移動生成遷移的第一步,這是我個人不同意的設計決定。它仍然不可能在你的目標EF7中,正如我原先所說的那樣(它已經從EF7中刪除了,看起來像in this SO post以及this blog postmember of Microsoft EF team所提到的在Ivan的評論中提到),但在Martin回覆後在EF6中進行了測試。第二步可以自動化,因爲你也已經發現了,所以我不會再重現它。是

的第一步步驟如下(在ASP.net MVC Web應用程序與EF6):

  1. 在你的項目(這應該已經有一些模型和一致的狀態中運行),去包管理器控制檯並運行Enable-Migrations –EnableAutomaticMigrations。如果您的應用程序具有單個數據庫上下文,則它也會應用這些更改。
  2. 現在轉到現有模型並在其中添加一個新字段,例如public String TestField { get; set; }
  3. 作爲代碼首先自動遷移是ON,則不需要再次運行Add-Migration命令(希望,因爲我在這個答案的後半部分指出),你只要運行Update-Database和DB應該讓你更新應用程序運行良好。

爲什麼自動模式變化監測,生成和更新數據庫中自動有時可能會適得其反(愚見和MSDN page):

  • 自動遷移外地的變化不會工作重命名,按MSDN。
  • 在添加原始字段類型的情況下,需要考慮現有數據,並且在這種情況下您應該考慮手動遷移。
  • 您可以穿插自動和基於代碼的遷移,但這不建議在團隊開發方案中使用。如果您是使用源代碼管理的開發團隊的一員,則應使用純自動遷移或純粹基於代碼的遷移。鑑於自動遷移的限制,MSDN建議在團隊環境中使用基於代碼的遷移。
  • 它很好地確認模型更改是故意的,並且不是某些剩餘代碼在更改期間產生的結果,可能發生的情況和自動執行完整過程可能會導致對數據庫的更改。
  • 由於某些數據限制或類似問題,生成的遷移並不總是被優化和/或失敗,因此應該審查。
  • 即使在遷移正在處理的負載數據的某些情況下,甚至更新數據庫也會在生產數據上超時。我們不得不手動遠程運行它並重新啓動服務器。

以上可能並不適用於所有人,但我認爲應該分享爲什麼我同意沒有將遷移生成和應用程序設置爲自動化數據庫的設計決定的原因。

每個考慮啓用自動遷移的人都應該確定閱讀MSDN page以獲取更多示例和缺點。

+1

*對於EF7,如果我找到一種方式(或其他人),將更新此答案。*不要浪費你的時間搜索。請閱讀EF核心團隊成員[bricelam](https://www.bricelam.net/2014/12/16/ef7-migrations-designtime.html)的[EF Core Migrations:Design-time] //stackoverflow.com/users/475031/bricelam)解釋了爲什麼自動遷移已從EF Core中刪除。 –

6

Entity Framework 4.3 has introduced the Automated Migrations

儘管我同意哈桑的回答,說這可能非常棘手,但這個選項確實存在。

這裏是一個簡短的簡歷:

  1. 啓用遷移,必須在程序包管理器控制檯提供了一個參數:

啓用的遷移-EnableAutomaticMigration:$真

  1. 配置類將自動生成一個LLY產生:

    public Configuration() 
    { 
        AutomaticMigrationsEnabled = true; 
    
        //Set this parameter to true if you want to let auto-migration delete data when a property is removed from an entity. 
        //Not setting this will result in an exception when migration should remove a column. 
        AutomaticMigrationDataLossAllowed = true; 
    } 
    
  2. 設置DB初始化程序在你的上下文類

    Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDBContext, MyConfigurationClass>("MyConnectionString")); 
    

而且你去那裏,更改模型,看到了變化......

我米仍然不知道我會使用它,因爲我想我的數據庫改變,當我這麼說...

+0

不錯的發現馬丁,我也繼續閱讀更多關於它,並發現他們MSDN有一個頁面上的例子,雖然它帶有警告,它不會在字段重命名和更多的問題可以出現在團隊環境,所以他們也不鼓勵繼續傳播。從來沒有選擇似乎在那裏。 – Hassan

+0

@Hassan你能鏈接MSDN頁嗎?我認爲這個答案的一個大標題警告聲明這種用法是不鼓勵的,可能會對未來的讀者有所幫助。 –

+0

是的這是我最後閱讀的內容 https://msdn.microsoft.com/zh-cn/library/jj554735%28v=vs.113%29.aspx?f=255&MSPPError=-2147217396 我要更新我的答案很快就有了更多細節,只需測試幾件事情就可以了。 – Hassan