0

我正在使用實體框架代碼進行第一次遷移。我第一次沒有啓用遷移。當我運行這個項目時,它創建了一個包含一行的_migrationhistory表。EF如何在沒有遷移歷史記錄表的情況下檢測模型更改

然後我刪除這個表並運行應用程序,它運行成功。現在我添加一個屬性到實體並嘗試運行,但它沒有運行抱怨該模型與數據庫不兼容。

我的問題是如何EF和數據庫知道模型改變或數據庫是不同的模型沒有_migrationhistory表或在代碼中的遷移?

+0

EF只在應用遷移時查看_migrationhistory。如果使用migratedatabasetolatestversion,它將構建模型並將其與上次代碼遷移的資源文件中存儲的模型(如果沒有空白數據庫)進行比較。如果他們不匹配,你會得到這個錯誤。見[這裏](https://channel9.msdn.com/Blogs/EF/Migrations-Under-the-Hood)。 –

回答

1

實體框架首先檢查數據庫是否有_migration歷史記錄表。如果沒有,則會嘗試創建一個並從頭開始運行所有遷移,並將遷移名稱作爲記錄插入遷移歷史記錄表中。

因爲您已經刪除了遷移歷史記錄表,實體框架無法將其遷移記錄與遷移文件進行比較。因此,它會嘗試再次運行所有遷移。但是,這個數據庫已經有相關實體的表格。因此,向用戶顯示錯誤消息(型號與數據庫不兼容)。

+0

您的陳述「因此,它試圖再次運行所有遷移」,我沒有任何遷移。 –

+1

「dbo._MigrationHistory」表不會在沒有任何初始遷移的情況下創建。檢查Migrations文件夾下的任何遷移文件。 – Tejus

+1

也在Configuration.cs中檢查AutomaticMigrationsEnabled是否設置爲true或false。如果設置爲true,則實體框架將自動嘗試升級數據庫而不使用遷移文件。 – Tejus

相關問題