1. 程式人生 > >EF-使用遷移技術讓程序自動更新數據庫表結構

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

database 添加 del sys rate 年齡 .com code add

承接上一篇文章:關於類庫中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; }
    }
}

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

技術分享

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

驚不驚喜?

意不意外?

高不高興?

開不開心?

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

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