1. 程式人生 > 實用技巧 >Entity Framework 實體資料模型——資料庫更新和遷移

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命令來回滾到進行降級遷移前的狀態。