2017-08-17 173 views
0

我想用現有的數據庫遷移並創建一個新的,如果不存在。EF核心遷移

的EF核心單證說:

如果您創建的初始遷移時數據庫中已存在,則生成數據庫創建代碼,但它並沒有運行,因爲數據庫中的數據模型已經匹配。當你部署應用程序到另一個環境中,該數據庫不存在,該代碼將運行到創建數據庫

From EFCore docs

我最初的遷移,它創建了一個向上和向下的方法來創建我的桌子。當我將它運行到新數據庫(連接字符串中的新數據庫名稱)時,它會按預期創建數據庫和表。

但是,如果我將其運行到現有數據庫(不是由遷移創建的),它會嘗試創建一個已存在的表並且遷移停止運行的第一種方法失敗。

Docs說「它不必運行」,但遷移正在做的第一件事是嘗試創建一個現有的表。

如何防止遷移以嘗試創建現有表?在遷移中有內置的「創建如果不存在」?文件是正確的嗎?它應該按預期的方式工作/在文檔中描述?

如果我做錯了,那麼使用遷移與現有數據庫和新數據庫一起運行的策略是什麼?

Dotnet Core版本:1.1。 EFCore版本:1.1.2。

在此先感謝。

回答

3

您需要現有數據庫的基準遷移。在EF 6中,您使用了-IgnoreChanges標誌,但現在在Core中不存在。見here

通過註釋掉所有Up()代碼並應用該遷移,您可以在EF Core中完成同樣的事情。這將創建__MigrationHistory表並插入表示已應用的記錄。

隨後的遷移將應用於這兩者,並且您需要創建一個新的數據庫。

+0

是的,它做到了這一點,但如果使用context.Database.Migrate(),仍然不足以在生產環境中工作。 – user1203003

+0

是的,您可能可以使用'Database.EnsureCreated'做些事情,但這隻會創建模式,而不會創建遷移歷史記錄,所以如果它返回true(僅限第一次),則退出應用程序並返回並點擊遷移。根據您需要更新的數量,在PROD上運行腳本可能會更容易添加最初的內容。 –

相關問題