Entity Framework 實體資料模型——資料庫更新和遷移
一、EF 設計器資料庫更新
1、首先建立專案:MyEFProject 並 新增新建項:
其次,選擇 ADO.NET 實體資料模型 並 命名為:StudentDataModel
然後,選擇 來自資料庫的 EF 設計器:
接著,匯入資料庫檔案:
最後,選擇要進行對映的Student表:
2、從資料庫更新模型
EF 設計器在完成設定之後,如果資料庫有任何修改,我們可以通過更新功能來完成同步模型的操作。
開啟 .edmx 檔案的編輯介面,在空白位置點選滑鼠右鍵,選擇從資料庫更新模型:
出現更新嚮導彈層,可以看到,它有三個頁籤:新增、重新整理 和 刪除。
①新增:該頁籤會展示資料庫中尚未加入模型檔案的項。 可以看到未加入模型的 Course 表 赫然在列!
選擇 Course 表,點選 完成 即可將其加入模型檔案。
②重新整理:該頁籤會展示資料庫中已加入模型檔案的項。
③刪除:該頁籤會展示模型檔案中無法對映的資料庫項。
比如資料庫中原本存在的物件被刪除,資料模型卻無法得知此物件已經不存在,
其對映的模型還是會顯示,此時其相關的物件資訊便會出現在刪除頁籤中。
EF 設計器同時提供了其他功能,以維護資料庫結構與資料模型的對映,然而視覺化介面在實際維護開發中的操作並不容易,
比較好的方式是採用Code First模式。
二、Code First 資料庫遷移
與視覺操作介面相比,Code First 機制提供了一套命令列模式的遷移工具,來協助我們有效的進行資料庫與資料模型的同步維護操作。
1、資料庫遷移
接下來,先建立一個的專案:CFMigrations,
開啟 “SQL Sever 物件資源管理器” (檢視 ->SQL Sever 物件資源管理器)選擇 資料庫 點選滑鼠右鍵,選擇 新增新資料庫:
然後在選擇 ADO.NET 實體資料模型 時,選擇 來自資料庫的 Code First:
選擇剛剛新建的資料庫:
好了,資料模型已經建立完成。接下來需要新增一個 Student.cs 類檔案:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CFMigrations { public class Student { public int Id { get; set; } public string StudentName { get; set; } public bool Sex { get; set; } } }
開啟CFStudentInfoModel.cs 類檔案,新增 Students 屬性:
在遷移的過程中,Students 屬性會在 StudentInfo 資料庫中建立一個新的 Student 資料表。
現在需要開啟 程式管理器控制檯:工具 → NuGet包管理器→ 程式包管理器控制檯。
在 PM> 後面鍵入Enable-Migrations 並按 Enter 鍵,可以看到已為專案啟動了遷移功能。
在 PM> 後輸入 Add-Migration AddStudent 命令,來建立遷移檔案:
AddStudent 是自定義名稱,表示要建立的遷移檔名。
可以看到,遷移功能自動建立的遷移檔案 202011270635371_AddStudent.cs,預設是以:建立的日期時間+_+自定義遷移名。
這個檔案裡存在兩個方法:Up 和 Down。
Up 方法表示此次遷移的內容,將在連線資料庫時建立 Student 表並根據 Student 類的屬性設定其對映欄位及型別。
Down 方法表示將 Students 表從資料庫中刪除。通過呼叫該方法可以將資料庫恢復至此次遷移前的狀態。
Code First 遷移通過這兩個方法記錄每次變動的內容,以支援資料庫的升級和降級。
我們可以通過每一個帶時間資訊的遷移檔名,便捷的來進行回溯遷移。
在 PM> 後輸入Update-Database 命令,來完成第一次的遷移操作:
接下來開啟 伺服器資源管理器 (在檢視選單下) 對話方塊中的資料庫,看到以下介面證明遷移成功:
然後在主程式Program.cs 中鍵入以下內容:
static void Main(string[] args) { using (var cxt = new CFStudentInfoModel()) { var count = cxt.Students.Count(); Console.WriteLine($"學生表有{count}個學生"); Console.ReadKey(); } }
F5 執行,可以看到:
好了,遷移完成!
開啟遷移成功的資料庫,不難發現多了個 __MigrationHistory 表,它是用來記錄遷移操作的。
對比一下可以看出,MigrationId 欄位記錄的是所執行的遷移檔案的名稱,通過這些記錄,我們可以很方便的追蹤到每一次的遷移內容。
2、結構變動遷移
需求總在變,完成第一次遷移之後,難免會一成不變。接下來總結一下在結構變動後該如何進行同步遷移。
首先,開啟 Student 類,並在其中新增一個Age 屬性。
此時如果執行程式,會報如下錯誤:
這是因為實體類發生了改變,卻沒有對映到資料庫所導致的錯誤。
我們需要重新開啟 “程式包管理控制檯”,並在其中依次鍵入以下命令:
①Add-Migration AddStudentAgeProperty
② Update-Database
每次進行遷移操作,遷移程式就會生成一個對應時間點的遷移檔案。
執行完成以後,程式又可以運行了。
如果想探究一下遷移程式在進行遷移是所使用的SQL語句,我們可以通過Update-Database -Verbose 命令來進行檢視。
3、指定遷移
在執行 Update-Database 命令時,可以進一步指定所要遷移的版本:
Update-Database -TargetMigration:AddStudent
這個命令會指定遷移到首次遷移的狀態,也就是降級遷移。但如果是平級遷移就不會產生任何影響。
當然我們還可以通過Update-Database -TargetMigration:AddStudentAgeProperty命令來回滾到進行降級遷移前的狀態。