EF-使用迁移技术让程序自动更新数据库表结构

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

EF-使⽤迁移技术让程序⾃动更新数据库表结构
承接上⼀篇⽂章:
本篇讲述的是怎么使⽤迁移技术让程序⾃动通过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 ponentModel.DataAnnotations;
using ponentModel.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框架去映射实体模型和数据库。

只在程序代码中动动⼿指头,就能轻轻松松的调⽤数据库,使⽤数据。

相关文档
最新文档