EntityFramework项目“The model backing xxx context has changed ”错误解决-CodeFirst迁移踩坑记录
本文為本人日記,用于個人記錄。
報錯現象:
The model backing the 'XXXXContext' context has changed since the database was created. Consider using Code First Migrations to update the database?
?
環境及背景:
接收古董項目10年前的代碼,攤上傳說中的祖傳代碼,踩坑無數,今天說說其中一個坑。個人是不喜歡EF的,做個Demo還行,真實項目上使用靈活性太差。
古董代碼環境:VS2010+EF4.1+WCF+C#+SQLServer2008+WinForm+C++_硬件API+硬件
需求:數據庫不能重建,在老庫(已有數據)某兩個數據表增加幾個字段。(注意需求是已有數據)
工程組成:Model層、WCFService層、WinFormClient層
?
踩坑場景還原:
針對想當然做法:Model層對表對應實體中增加字段、數據庫中手動以SQL增加兩個列、更新WCF引用,坐等測試通過
運行現象:WinFormClient調用WCF,在WCFService層非改動表使用using (XXDBContext db = new XXDBContext())拋出異常,異常消息:The model backing the 'XXXXContext' context has changed since the database was created. Consider using Code First Migrations to update the database?
不好,大事不妙,悟空壞了蟠桃大會,后果很嚴重,黎叔很生氣。上下求索的路子曲折,這里不贅述了。
?
前提:重要的事情說三遍,備份數據庫備份源碼X3
?
解決辦法:
關鍵思想:CodeFirst模式EF代碼與數據庫形成了綁定關系,手動修改數據庫增加列后,EF不認。通過EF CodeFirst遷移方式,讓EF對數據表字段新增修改。
?
步驟
?
程序包管理控制臺再次輸入啟用遷移的命令Enable-Migrations,本例前面嘗試過幾次所以使用Enable-Migrations -Force
?
把實體類工程EntityModel設置為啟動項目
再次執行命令Add-Migration AddCol_Table。如果仍報數據庫連接錯誤,則可嘗試使用“
Add-Migration AddCol_Table -ConnectionString "Data Source=127.0.0.1;Initial Catalog=xxx;user id=xx;password=xx"
位于命令管道位置 1 的 cmdlet Add-Migration
請為以下參數提供值:
ConnectionProviderName: System.Data.SqlClient
Scaffolding migration 'AddCol_C_RoutinePower'.
”
?
此命令執行后會在當前工程下創建一個202008280232342_AddCol_Table.cs文件,文件代碼大致類似如下 namespace EntityModel.Migrations {using System.Data.Entity.Migrations;public partial class AddCol_Table: DbMigration{public override void Up(){CreateTable("xxx",c => new{xxxx}).PrimaryKey(t => t.xxx);}public override void Down(){DropIndex("xxx", new[] { "cc" });DropForeignKey("xxx", "bb", "aa");DropTable("xxx");}} }?
我們不需要上面的刪除表和新增表代碼,修改代碼為新增字段刪除字段
namespace EntityModel.Migrations {using System.Data.Entity.Migrations;public partial class AddCol_C_PowerCalibrateBase : DbMigration{public override void Up(){//下面的代碼是wdh手動添加的。AddColumn("dbo.xxx", "aaa", c => c.Double(nullable: null));}public override void Down(){DropColumn("dbo.xxx", "aaa");}} }?
輸入命令,用指定連接字符串將上述代碼更新到數據庫。命令:update-database -verbose -ConnectionString "Data Source=127.0.0.1;Initial Catalog=xxxx;user id=xxx;password=xxx",在提示后輸入“System.Data.SqlClient”
?
檢查數據庫中表字段是否已經新增成功了。
如果update-database命令執行未報錯,前面已執行過多次,但數據庫中對應的表字段未加上。處理辦法:將[dbo].[__MigrationHistory]表中的與當前記錄重復202008280307106_AddCol_Table記錄刪除,然后重新執行一遍update-database命令。
打開客戶端,重新調用WCF,OK,通過。
?
官方參考
https://docs.microsoft.com/zh-cn/ef/ef6/modeling/code-first/migrations/?redirectedfrom=MSDN
參考:
https://www.cnblogs.com/chenwolong/p/migrations.html
https://www.cnblogs.com/haogj/archive/2012/02/17/2356537.html
https://www.cnblogs.com/Laimic/articles/4318707.html
https://blog.csdn.net/hit_why/article/details/72778785?utm_source=blogxgwz28
nuget包:
https://www.nuget.org/packages/EntityFramework/
總結
以上是生活随笔為你收集整理的EntityFramework项目“The model backing xxx context has changed ”错误解决-CodeFirst迁移踩坑记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FL Studio21.0.0中文版发布
- 下一篇: 把自己卖了!!!