2013-10-02 34 views
19

我在實體框架版本5中遇到了代碼優先遷移的奇怪問題。有時Update-Database由於掛起更改而失敗,但Add-Migration命令僅生成遷移,其中數據庫更改已包含在上次遷移中並且數據庫爲最新。因此,我希望新的遷移是空的。爲什麼添加遷移有時會創建重複的遷移?

Add-Migration如何檢測應發生的更改?它似乎沒有使用數據庫作爲源。

回答

35

將數據庫模型的快照與每個遷移一起保存在.resx文件中。當您添加新遷移時,EF會將當前數據庫模型(從您的模型類和DbModelBuilder中的設置生成)與上次遷移進行比較,並確定它們之間的變化。

如果您的遷移不同步,則可能會出現您描述的問題。如果兩個開發人員進行兩次獨立的遷移,並且這些遷移稍後會合並回默認分支,則會發生這種情況。

實施例:

顯影劑1

遷移AddColumnA

顯影劑2

遷移AddColumnB

合併版本

遷移AddColumnA - 數據庫快照包括columnA

遷移AddColumnB - 數據庫快照包括columnB但不 columnA

如果添加另一個遷移,變化是針對移民AddColumnB確定,不包含有關columnA的信息。解決此問題的方法是生成虛擬遷移(具有空的Up和Down方法),以便在上次遷移時擁有正確的數據庫模型快照。

合併版本

遷移AddColumnA - 數據庫快照包括columnA

遷移AddColumnB - 數據庫快照包括columnB但不 columnA

遷移虛擬 - 數據庫快照與columnA和columnB

+1

Very有趣的。有沒有辦法阻止基於該資源文件創建遷移,以便將數據庫用作參考?在我看來,這是一個嚴重的遷移缺陷,因爲我真的想要有EXPLICIT遷移文件而不是自動遷移,但不想在同一代碼庫上使用多個開發人員時擁有大量虛擬遷移文件。 –

+2

恕我直言,沒有辦法指定數據庫作爲參考。您可以更新到第一次遷移(AddColumnA),然後重新生成第二次遷移,而不是創建虛擬遷移。 Up和Down方法將保持不變,但數據庫快照將更新爲正確的版本,並且虛擬遷移將不是必需的。 –

+0

感謝您提供所有信息,但在每次合併修訂之間進行切換比擁有「醜陋」/空合併遷移文件更麻煩。至少如果你每天做一個或多個合併。 –