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; } } }
運行程序後,我們看一下數據庫中的表結構:
已經成功更新了Student表結構。
驚不驚喜?
意不意外?
高不高興?
開不開心?
在CodeFirst模式中,我們沒有動過數據庫一個代碼,完全靠的是ORM框架去映射實體模型和數據庫。只在程序代碼中動動手指頭,就能輕輕松松的調用數據庫,使用數據。
EF-使用遷移技術讓程序自動更新數據庫表結構