首先在使用数据库迁移之前我们先做一下准备工作:
- 新建一个控制台应用程序工程TestProject,使用CodeFirst的形式使用EF。
- 在项目中引入EntityFramework
如果电脑联网,则可以直接右键单击TestProject,选择管理nuget程序包,搜索EntityFramework后进行安装。如果是内网电脑,则可以提前下好EntityFramework包文件,同样右键选择管理nuget程序包,单击设置按钮,在新窗体中添加程序包源后进行安装。
- 创建数据模型Student和数据库上下文
public enum EnumGneder
{
男,
女,
保密
}
public class Student
{
public int ID { get; set; }
public string Name { get; set; }
public EnumGneder Gender { get; set; }
public int Age { get; set; }
}
public class StudentDbContext : DbContext
{
public DbSet<Student> Students { get; set; }
}
- 在Program的Main函数中添加如下代码后运行查询,查看结果
static void Main(string[] args)
{
StudentDbContext db = new StudentDbContext();
db.Students.Add(new Student() { ID = 1001, Name = "Wang Wei", Gender = EnumGneder.男, Age = 20 });
db.Students.Add(new Student() { ID = 1002, Name = "HanMeiMei", Gender = EnumGneder.女, Age = 18 });
db.SaveChanges();
foreach (var stu in db.Students)
{
Console.WriteLine(stu.Name);
}
Console.ReadKey();
}
运行结果:
说明EF自动根据模型为我们创建了数据库
查看数据连接参数后发现,由于我本机安装了SQLEXPRESS,系统自动为我们在SQLEXPRESS中创建了数据库。数据库名称为包含命名空间的数据库上下文名称
打开SQLEXPRESS数据目录,会发现刚刚创建的数据库已经存在。
注意:如果我们安装了SQLEXPRESS数据库,DataBase将会安装在Local SQLEXPRESS Instance,否则code first才将尝试使用localdb。只要安装了SQL EXPRESS,它总是具有优先选择权。
使用数据库迁移:
- 首先再Student类下增加一个属性,然后点击运行,报出错误:
public string Url { get; set; }
提示我们数据库发生改变,使用数据迁移功能进行更新。
单击菜单栏工具》》选择库程序包管理器下的程序包管理控制台》》运行命令:Enable-Migrations
命令执行完成之后将会在项目下创建Migrations文件夹,记录迁移日志
其中201907030852498_InitialCreate.cs类记录初始创建数据库时的记录。
Configuration.cs类允许你去配置如何迁移,本文使用默认的配置。在本文中只有一个DBContext,Enable-Migrations将会自动适配。
从EF6开始,Configuration类将会包含一个ContextKey属性,它将作为每一个Code First Model的唯一标识符。_MigrationsHistory表中一个相应地列出允许来自多个模型的实体共享表。默认情况下这个属性被设置成context的完全限定名。
必须熟悉的命令:
Add-Migration:创建一次基于上一次迁移以来的更改的迁移。允许我们对迁移命名。如
Add-Migration ‘AddUrl’
-
执行Add-Migration ‘AddUrl’
执行完成后,会在Migration文件夹下生成一个新的类文件,记录操作,如下:
此时,数据库并未改变,Student表中未增加Url列,还需要执行以下Update-Database命令,才能将更改更新到数据库 -
在Student中增加一个Address属性和Course的集合。增加一个Course类如下:
public string Address { get; set; }
public virtual ICollection<Course> Courses { get; set; }
public class Course
{
public int ID { get; set; }
public string CourseName { get; set; }
public DateTime CouserDate { get; set; }
}
运行:Add-Migration AddCourseClass
我们可以对迁移做些更改,如设置CourseName为唯一索引,Address为非空
然后运行命令:Update-Database –Verbose。注意必须有个空格隔开。执行后再数据库中增加了相应的表和属性信息。
定制SQL,进行数据初始化。
Student类中增加OtherName;
public string OtherName{get;set;}.
执行 Add-Migration 'AddOtherName’
增加Slq语句进行初始化赋值。
执行:Update-Database –Verbose。
迁移数据库到指定版本
迁移数据库到指定版本:如回到AddUrl
执行命令:Update-Database –TargetMigration:AddUrl
迁移数据库到空数据库:
执行命令:Update-Database –TargetMigration:$ InitialCreate
导出迁移记录的sql脚本:Update-Database -script -SourceMigration:$InitialCreate -TargetMigration:AddUrl
注意:如果没有指定目标迁移,那么迁移将始终更新至最新版本。如果没有指定源迁移,那么迁移将以数据库目前状态为初始。
设定程序启动自动更新数据库至最新版本:在程序入口处添加代码:
Database.SetInitializer(new MigrateDatabaseToLatestVersion<StudentDbContext, Configuration>());