2013-10-01 121 views
13

我有一堆Code First創建的表。如何強制EF代碼首先重新創建數據庫?

然後在SQL中我刪除了一個表,這樣我就不可避免地在堆棧上提出這個問題。

當在包管理控制檯中使用update-database我得到:

找不到對象「dbo.ContractParents」,因爲它不存在 或者您沒有權限。

什麼是重新創建我的表的最佳方法?

我讀過了約context.Database.CreateIfNotExists();

我把它放在我的種子功能,但沒有這樣做。

謝謝!

+3

遷移不會爲您修復殘缺的數據庫。它將數據庫從已知狀態轉換爲新的已知狀態。您必須手動重新創建表或創建一個全新的數據庫。 –

回答

10

爲了解釋與更新的數據庫命令發生了什麼,以及爲什麼在種子context.Database.CreateIfNotExists()方法不起作用:

當您運行更新的數據庫命令,它首先看你的連接字符串是否數據庫在那兒。如果是這樣,它會查看遷移歷史記錄表,並檢查與您的類別DbContext類別相關的內容。如果發現有表丟失或更改,它將嘗試更新數據庫。 Seed方法直到完成之後才被調用,所以這就是爲什麼不起作用。

在使用EF-代碼首先,我通常是在幾個不同的方式取決於我的數據庫有多大接近問題的發展。我通常選擇刪除所有表(包括遷移歷史表),然後再次運行update-database命令。工作得很好,如果你有很多FK約束很多的表,那就很費時間了。

我終於累了它,並發現these scripts做桌子的下降成倍速度更快。我去了這個,因爲我在Azure上運行我的應用程序。當我在本地機器上運行它時,我將刪除整個數據庫並創建一個具有相同名稱的全新數據庫。

優雅的解決方案?沒有。 它工作嗎?或多或少...

+0

+1感謝您的闡述。 – Pinch

4

對於一個快速和骯髒的方法,即會送你回家吃飯上的時間,有很多dataloss沿

降DBO .__ MigrationHistory系統表(我使用的測試數據是仍處於測試階段)

以及所有其他表格。

備份您的數據先!

update-database -verbose(你可能需要一些醬油蘸麪條)

我沒有印象,但它的作品。

希望有人會在未來想出更好的答案。

這將有助於更好地理解遷移。

+1

這裏有一些很好的提示:http://elegantcode.com/2012/04/12/entity-framework-migrations-tips/ – Colin

+0

@Colin感謝您的提示! – Pinch

+0

爲了記錄,'__MigrationHistory'不是一個系統表,只是一個帶有前綴的常規表。 – MEMark

6

對於又一俗氣選項...

右鍵點擊服務器資源管理器中你的數據庫,並點擊刪除 然後,你可以做

Enable-Migrations -EnableAutomaticMigrations -Force 

Update-Database -Force 

骯髒的更新,乾淨結果:)

相關問題