EF-使用遷移技術讓程序自動更新數據庫表結構


承接上一篇文章:關於類庫中EntityFramework之CodeFirst(代碼優先)的操作淺析

本篇講述的是怎么使用遷移技術讓程序自動通過ORM框架將模型實體類結構映射到現有數據庫,並新增或修改與之對應的表結構。

無論承不承認,都要使用到visual studio的“程序包管理器控制台”執行相關的命令。

 

1、使用"程序包管理器控制台"

工具》NuGet程序包管理器》程序包管理器控制台

這貨的界面是這樣子的:

選中默認項目為DAL,因為我們在DAL項目安裝了EntityFramework程序包。輸入命令Enable-Migrations,大小寫無所謂,都可以。該命令的意思是:激活遷移,也就是激活程序中的自動遷移技術。該命令只有在安裝了EntityFramework程序包的項目中有效。如果沒有成功安裝EntityFramework程序包,使用不了該命令,會出錯。

激活遷移成功的界面如下圖:

當DAL項目的遷移被激活成功后,會在該項目下自動生成一個Migrations文件夾,里面包含一個密封的遷移配置類,還有一個使用當前時間生成的類(該類中包含修改前的數據庫中已經存在的表結構)。

 

 

2、遷移配置

打開DAL項目中Migrations文件夾下的Configuration.cs文件。將Configuration類的構造函數改為如下代碼:

        public Configuration() {
            //將AutomaticMigrationsEnabled設置true,表示啟用自動遷移技術
            AutomaticMigrationsEnabled = true;
            //將AutomaticMigrationDataLossAllowed設置為true,表示在更新數據表結構時,允許丟失數據
            AutomaticMigrationDataLossAllowed = true;
            ContextKey = "DAL.DemoContext";
        }

如果該Configuration與應用程序不是在同一程序集,則需要將該Configuration類的訪問修飾符從internal改為public。這樣,在應用程序中才能使用該Configuration類。

 

3、使用遷移

在控制台應用程序的Main方法中,加上Database.SetInitializer(new MigrateDatabaseToLatestVersion<DemoContext, DAL.Migrations.Configuration>())。如下圖所示:

接下來運行程序。程序成功運行后,讓我們來對比一下結果。

數據表結構更新前:

 

數據表結構更新后:

使用程序自動更新表結構成功!

 

4、模型類屬性的特性約束

看一下上面的表結構,Name和Address的最大長度為max。

我們能否自定義一個最大的字符串長度呢?當然可以!

能否自動更新到表結構呢?你當我上面的那一篇幅文章是白講的嗎!!!

更新Model層的Student類,給某些字段添加特性約束。屬性的特性約束,不僅在程序中可以使用,也能自動更新到數據庫。如下代碼:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Model {
    //指定表名
    [Table("Student")]
    public class Student {
        //指定該表的主鍵
        [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid ID { get; set; }

        [MaxLength(50,ErrorMessage ="姓名的最大長度為50個字符")]
        public string Name { get; set; }

        [Range(typeof(DateTime),"1900-01-01","2017-07-01")]
        public DateTime? BirthDay { get; set; }

        [Range(1,150,ErrorMessage ="年齡范圍在1~150歲之間")]
        public int? Age { get; set; }

        [MaxLength(100,ErrorMessage ="地址的最大長度為100個字符")]
        public string Address { get; set; }
    
//加上一個時間戳,在並發操作的時候,只允許一個操作對其進行更改。另外一個操作對其更改時會報錯。樂觀鎖的一種實現方式。
     [Timestamp]
     public byte[] RowVersion { get; set; }
} }

運行程序后,我們看一下數據庫中的表結構:

已經成功更新了Student表結構。

驚不驚喜?

意不意外?

高不高興?

開不開心?

在CodeFirst模式中,我們沒有動過數據庫一個代碼,完全靠的是ORM框架去映射實體模型和數據庫。只在程序代碼中動動手指頭,就能輕輕松松的調用數據庫,使用數據。

 


免責聲明!

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



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