2012-04-20 17 views
18

我使用Entity Framework Code First開始了我的項目。當我準備好時,我將我的數據庫和代碼上傳到我的主機提供商。一切正常。MVC3和代碼優先遷移 - 「自從創建數據庫以來,支持'blah'上下文的模型已經發生了變化」

我需要添加一個新的字段給我的一個類,我不想丟失數據庫中的數據。因此,我嘗試了一些關於使用Code First Migrations的博客文章。我做了以下:

  1. 我備份了我的遠程(生產)數據庫。
  2. 我重視這個數據庫在本地
  3. 我加入了財產上我的課
  4. PM>啓用的遷移
  5. PM>添加遷移AddSortOrderToCar
  6. PM>更新,數據庫
  7. 在這一點上我創建本地數據庫的.bak文件,然後使用該文件'恢復'到遠程文件。
  8. 最後,我將代碼發佈到遠程站點。

當我訪問該網站時,我收到以下錯誤消息: 自創建數據庫以來,支持'blahblah'上下文的模型已更改。考慮使用Code First Migrations來更新數據庫。

我在做什麼錯?

回答

23

根據我的經驗,這表明遷移表不同步(即使您的數據不同步),現在已經是數據庫模式的一部分(從4.3開始我認爲 - 在系統表下)。

可能有很多理由和方式來體驗錯誤,但大部分的時間...

有問題的部分是手動備份/還原完整的數據庫代碼的某些組合一起改變 - 我不完全確定爲什麼總是。

簡而言之,即使Db-s是相同的遷移表數據可能不會 - 並且哈希比較可能會失敗(仍然完整恢復聽起來像夠好 - 但您有'雙方')。


我什麼工作原理是利用
Update-Database -Script

這與「遷移差」創建了一個腳本,
您可以手動應用爲目標服務器數據庫的SQL腳本(和你應該得到正確的遷移表格行插入等)。

如果這仍然不起作用 - 你仍然可以做兩件事...

  1. 刪除遷移表(目標 - 在系統表) - 按在那裏http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-automatic-migrations-walkthrough.aspx評論 - 應該故障回覆到以前的行爲,如果你確信你的數據庫-S是相同的 - 它只是去「信任你」,

  2. 爲我所用最後一招 - 讓全模式的Update-Database -Script(例如,通過初始化一個空分貝,應強制「全劇本」),
    找到INSERT INTO [__MigrationHistory]記錄,
    只是運行這些,將它們插入到數據庫中,
    ,並確保您的數據庫 - 和代碼匹配,

這應該使事情再次同步運行。

(免責聲明:這不是防彈在任何時候都工作,您可能需要嘗試給當地的情景幾件事情 - 但應該讓你同步)

+1

「更新,數據庫-Script」工作。我會認爲'更新數據庫'命令會做同樣的事情(但不生成腳本)。無論如何。謝謝! – 2012-04-22 17:44:16

+1

@ScottDietrich - np - 它應該,但是你必須保持所有方面的同步(並且例如根據本地數據庫的「狀態」生成遷移等),所以遷移是爲了適合你的'本地'數據庫與代碼 - 一旦你開始「移出東西」,那麼你做錯事的機會就會增加)。總而言之,SQL腳本證明是更安全的方式,你可以看到 - 除非你在服務器上也有開發者設置(爲了能夠在那裏運行遷移) – NSGaga 2012-04-22 17:51:25

+0

我有一個DB,其中一些遷移有運行,但__MigrationHistory表中的記錄不會阻止那些嘗試再次運行的相同遷移。我最終刪除了__MigrationHistory表中的所有行,然後手動插入由-Script命令生成的INSERT INTO [__MigrationHistory]行。遷移歷史現在再次排列。感謝您提供非常有用的答案@NSGaga! – 2015-01-07 11:32:47

相關問題