承接上一篇文章:关于类库中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框架去映射实体模型和数据库。只在程序代码中动动手指头,就能轻轻松松的调用数据库,使用数据。