接着上篇結尾所說,如果開發中剛才遇到Model需要添加或者減少字段/屬性的話,但是剛好你也利用EF的Code frist通過Model生存的數據庫,這時改怎么辦?
添加一個字段
我們現在要給Movie實體模型類添加一個評價的字段該怎么搞!我們知道我們默認使用EF code frist生存的數據庫是同步性的,這樣才能便於我們更好的開發,如果實體模型和數據庫不同步的話,實體框架應該會拋出異常。
code frisr設置模型庫遷移
在VS里我們先移除dataBase,具體操作如下:
刪除EF連接,為了是我們的應用程序不出錯,我們需要做一下事情,具體操作如下:
完了在控制台窗體輸入一下內容:
運行完控制台的命令后我的項目結構變化如下:
多了一個數據遷移的Migrations文件夾,這個文件夾就是code frist遷移生產的,里面有一個歷史記錄的類還有一個配置信息類。我們打開Configuration.cs類,其面貌如下:
我們對Configuration.cs類的Seed方法進行從新構造,修改代碼如下:
接下的事情就是我們需要創建一個遷移DbMigration類,該類負責創建一個database,前面我們不是刪除了EF創建的database么。接下來我們在控制台窗體輸入下面的命令,具體操作如下:
這個命令就是新構建database並對其進行初始化動作。動作執行完成后你會發現,VS會自動生成一個這個文件,具體如下:
可以看到這個類里面有2個方法,就代碼直觀上解釋的話這個類在運行時的話有一個是在降級過程中執行的操作,另外一個則是在升級過程中的操作。生產的這個類包含創建數據庫的模式代碼,接下來的事情呢!就是這么把這個數據庫創建出來,並且把我們剛才加的測試數據給添加到數據庫中,接下來我們繼續在控制台窗體操作,具操作如下:
待命令跑完之后我們來運氣我們的應用程序看下效果,跑起來我們的程序看我們剛才添加的數據是否能正常顯示:
怎么樣,效果達到了吧!關於遷移這里可能有很多描述不是很清楚的地方,所以還請各位前輩朋友多多指教。
現在進入正題如果我給Model實體類添加一個字段的話怎么辦,比如我給Movie類添加了下面的字段,如下:
添加一個這個屬性后,你會立馬想到那是不是所有的頁面都要去加這個東西,還有Controller里面Action上帶Bind[Inculd(xxx,xxx,xxx,xx)]這些地方是不是都要去加這個東西呢,具體修改的地方如下:

Index.cshtml頁面:
Create.cshtml修改如下:
我們現在就直接先把程序運行起來看看會出現什么問題:
來個一個大黃頁,為什么呢!因為我們在代碼遷移數據的時候沒有給我們剛才新加的字段所以程序在這里不認識了,所以就出錯了,那改唄,哪里出錯就改哪里!我們修改Cofiguration類里的Seed方法如下:
修改完這個說還會出錯嗎?答案是肯定會的,為什么呢!是的我這里是添加了Model的新字段過來,但是數據庫里有沒有這個字段呢?我們先一步一步走着看,按照常規思維這里是應該先給數據庫添加這么一個字段,那么我們用控制台添加該字段,具體操作如下:
當我們執行完這個命令的話,就會在模型快照中添加上這么一個字段同時執行完這個的時候VS也會生出這么一段代碼,如下:
然后我們需要在控制台在更新一下datebase,具體操作如下:
更新完后,我們在運行我們的程序看看效果:
然后我們修改(哦,修改頁面也需要把Rating這個字段也加上)一個Rating為空的數據,看下效果:
使用這種方式添加字段就必須要改所有用到這些字段的頁面手動添加上對應的代碼,如上面在index/create/edit/delete.cshtml頁面上添加代碼。關於這篇的分享的東西就先介紹到這里,通過修改實體模型我們可以看到實體模型怎么和數據庫進行同步,這邊文章時間有些緊張有些地方可能描述的不是很清楚,還請各位朋友見諒及指導,哪里有不對的地方,還望指導我會第一時間去改正,這篇的話就先到這里吧!
