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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM