我正在使用實體框架代碼進行第一次遷移。我第一次沒有啓用遷移。當我運行這個項目時,它創建了一個包含一行的_migrationhistory表。EF如何在沒有遷移歷史記錄表的情況下檢測模型更改
然後我刪除這個表並運行應用程序,它運行成功。現在我添加一個屬性到實體並嘗試運行,但它沒有運行抱怨該模型與數據庫不兼容。
我的問題是如何EF和數據庫知道模型改變或數據庫是不同的模型沒有_migrationhistory表或在代碼中的遷移?
我正在使用實體框架代碼進行第一次遷移。我第一次沒有啓用遷移。當我運行這個項目時,它創建了一個包含一行的_migrationhistory表。EF如何在沒有遷移歷史記錄表的情況下檢測模型更改
然後我刪除這個表並運行應用程序,它運行成功。現在我添加一個屬性到實體並嘗試運行,但它沒有運行抱怨該模型與數據庫不兼容。
我的問題是如何EF和數據庫知道模型改變或數據庫是不同的模型沒有_migrationhistory表或在代碼中的遷移?
實體框架首先檢查數據庫是否有_migration歷史記錄表。如果沒有,則會嘗試創建一個並從頭開始運行所有遷移,並將遷移名稱作爲記錄插入遷移歷史記錄表中。
因爲您已經刪除了遷移歷史記錄表,實體框架無法將其遷移記錄與遷移文件進行比較。因此,它會嘗試再次運行所有遷移。但是,這個數據庫已經有相關實體的表格。因此,向用戶顯示錯誤消息(型號與數據庫不兼容)。
EF只在應用遷移時查看_migrationhistory。如果使用migratedatabasetolatestversion,它將構建模型並將其與上次代碼遷移的資源文件中存儲的模型(如果沒有空白數據庫)進行比較。如果他們不匹配,你會得到這個錯誤。見[這裏](https://channel9.msdn.com/Blogs/EF/Migrations-Under-the-Hood)。 –