2016-07-05 264 views
5

我在實體框架6.0。這是一個發展問題,而不是生產。EF代碼優先數據庫初始化和遷移混亂

我認爲我有一個相互衝突的策略。 目前我有一個DropCreateDatabaseIfModelChanges 數據庫初始化程序設置並使用種子方法在Configuration.cs啓用遷移。 在添加遷移和運行更新數據庫時,似乎像是何時刪除並重新創建數據庫以及何時運行種子方法一樣幸運。 事實上,這是一個總的抽獎,當兩者都發生時,我必須拉各種技巧才能使事情發揮作用。 有人可以告訴我是否有數據庫初始化程序和遷移啓用衝突。 謝謝

回答

3

這不是一個適當的組合。有一個MigrateDatabaseToLatestVersion初始化器用於遷移。

在早期開發過程中,您可能需要使用DropCreateDatabaseIfModelChanges初始值設定項(或CreateDatabaseIfNotExists)。初始化器有一個特殊的Seed()方法,只有在創建數據庫時纔會運行。

一旦你達到了數據庫中的內容是一種痛苦的重點,你可以切換到遷移。更改您的初始化程序並啓用遷移。請務必添加initial baseline migrationadd-migration Initial -IgnoreChanges),以便您僅在該點後才能獲得更改。現在,您可以添加每次更新時都會運行的遷移Seeding,而不是僅在創建數據庫時才運行的初始化程序Seed。

如果您需要重新創建數據庫,您可以生成一個idempotent script,它將創建數據庫並應用所有遷移。

+0

謝謝史蒂夫,最後一個comon意義上解釋這個東西是如何工作的。我已經啓用了遷移功能,並且有20多次遷移試圖讓這個東西起作用。因此,我將初始化程序更改爲MigrateDatabaseToLatestVersion,並使用遷移種子來添加或更新種子數據。 – ShaunK

+0

另外,我已經創建了初始遷移。我需要再次使用-IgnoreChanges來做到這一點,如果有的話,爲什麼。謝謝 – ShaunK

+0

取決於您是否有其他數據庫,如TEST,PROD或其他處於不同狀態的Dev機器。如果是這種情況,您需要將它們全部放在同一頁面上。如果這只是單個數據庫並且所有更改都已應用,則可以刪除所有遷移,刪除__MigrationHistory中的所有記錄並執行新的初始遷移-IgnoreChanges。現在,您的所有更改都將跟蹤向前發展。 –

相關問題