如何在EntityFramework中使用Migration数据迁移工具

首先在使用数据库迁移之前我们先做一下准备工作:

  1. 新建一个控制台应用程序工程TestProject,使用CodeFirst的形式使用EF。
    加粗样式
  2. 在项目中引入EntityFramework
    如果电脑联网,则可以直接右键单击TestProject,选择管理nuget程序包,搜索EntityFramework后进行安装。如果是内网电脑,则可以提前下好EntityFramework包文件,同样右键选择管理nuget程序包,单击设置按钮,在新窗体中添加程序包源后进行安装。
    在这里插入图片描述
  3. 创建数据模型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; }
		}
  1. 在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,它总是具有优先选择权。

使用数据库迁移:

  1. 首先再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’

  1. 执行Add-Migration ‘AddUrl’
    在这里插入图片描述
    执行完成后,会在Migration文件夹下生成一个新的类文件,记录操作,如下:
    在这里插入图片描述
    在这里插入图片描述
    此时,数据库并未改变,Student表中未增加Url列,还需要执行以下Update-Database命令,才能将更改更新到数据库

  2. 在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>());

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值