EFEF Code-First数据迁移

Posted 杨浪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EFEF Code-First数据迁移相关的知识,希望对你有一定的参考价值。

Code-First数据迁移 

首先要通过NuGet将EF升级至最新版本。

新建MVC 4项目MvcMigrationDemo

添加数据模型 Person 和 Department,定义如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.ComponentModel.DataAnnotations;
 6 using System.ComponentModel.DataAnnotations.Schema;
 7 
 8 namespace MvcMigrationDemo.Models
 9 {
10     public class Person
11     {
12         [Key]
13         public int PersonID { get; set; }
14 
15         [Required]
16         [MaxLength(20)]
17         public string PersonName { get; set; }
18 
19         public virtual Department Departmant { get; set; }
20 
21     }
22 }
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.ComponentModel.DataAnnotations;
 6 using System.ComponentModel.DataAnnotations.Schema;
 7 
 8 namespace MvcMigrationDemo.Models
 9 {
10     public class Department
11     {
12         [Key]
13         public int DeptID { get; set; }
14 
15         [Required]
16         [MaxLength(200)]
17         public string DeptName { get; set; }
18 
19         public ICollection<Person> Persons { get; set; }
20     }
21 }

 

添加控制器 PersonController

 1 using System.Data.Entity;
 2 
 3 namespace MvcMigrationDemo.Models
 4 {
 5     public class MvcMigrationDemoContext : DbContext
 6     {
 7         // 您可以向此文件中添加自定义代码。更改不会被覆盖。
 8         // 
 9         // 如果您希望只要更改模型架构,Entity Framework
10         // 就会自动删除并重新生成数据库,则将以下
11         // 代码添加到 Global.asax 文件中的 Application_Start 方法。
12         // 注意: 这将在每次更改模型时销毁并重新创建数据库。
13         // 
14         // System.Data.Entity.Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseIfModelChanges<MvcMigrationDemo.Models.MvcMigrationDemoContext>());
15 
16         public MvcMigrationDemoContext() : base("name=MvcMigrationDemoContext")
17         {
18         }
19 
20         public DbSet<Person> People { get; set; }
21         public DbSet<Department> Departments { get; set; }
22     }
23 }

 

调试,网址输入http://localhost:7139/Person 

登陆(localdb)\\v11.0,数据库如下图:

 

出现新建表[dbo].[Departments]和[dbo].[People],以及系统表[dbo].[__MigrationHistory]。

其中[dbo].[__MigrationHistory]用来追踪每次数据模型异动信息,如下图

 

MigrationId记录版本,Model记录这次创建时的数据模型,ProductVersion代表当前EF版本。

启动数据迁移

打开程序包管理器控制台,输入Enable-Migrations指令,以MvcMigrationDemoContext为例,输入如下:

Enable-Migrations -ContextTypeName MvcMigrationDemo.Models.MvcMigrationDemoContext 

运行结果如下:

 

查看解决方案资源管理器,如图

 

VS 会创建一个Migrations目录,包含两个文档201507070650021_InitialCreate和Configuration。

会发现201507070650021_InitialCreate刚好和[dbo].[__MigrationHistory].MigrationId一致,文档记录了创建本次数据模型的完整描述。

Configuration定义了数据库迁移该有的行为。

运行数据库迁移

修改Department数据模型如下:添加About字段

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.ComponentModel.DataAnnotations;
 6 using System.ComponentModel.DataAnnotations.Schema;
 7 
 8 namespace MvcMigrationDemo.Models
 9 {
10     public class Department
11     {
12         [Key]
13         public int DeptID { get; set; }
14 
15         [Required]
16         [MaxLength(200)]
17         public string DeptName { get; set; }
18 
19         [MaxLength(4000)]
20         public string About { get; set; }
21 
22         public ICollection<Person> Persons { get; set; }
23     }
24 }

 

在PM中,输入Add-Migration指令,必须带上一个版本名称,本次操作如下:

 

查看项目Migration目录,会发现新增文档:201507070718108_AddAbout

此时还没有对数据库做任何迁移动作,可查看数据表Department,无任何修改如图

 

手动添加测试数据如下图

 

进行迁移动作 在PM中输入Update-Database指令,本次操作如下:

 

更新数据库成功后,查看数据库。如下图。

 

到此,数据迁移完成。

附1:可通过Update-Database指令自动生成数据库迁移的T-SQL脚本,本次操作如下:Update-Database -SourceMigration 201507070650021_InitialCreate -TargetMigration 201507070718108_AddAbout -Script

 

附2:还原数据库  本次操作如下:Update-Database -TargetMigration 201507070650021_InitialCreate

 

查看此时的数据库,发现数据库已还原:

 

以上是关于EFEF Code-First数据迁移的主要内容,如果未能解决你的问题,请参考以下文章

20.2.翻译系列:EF 6中基于代码的数据库迁移技术EF 6 Code-First系列

Code-First 迁移问题

20.翻译系列:Code-First中的数据库迁移技术EF 6 Code-First系列

EF中 Code-First 方式的数据库迁移

Entity Framework学习-实体框架中的code-first迁移

20.1翻译系列:EF 6中自动数据迁移技术EF 6 Code-First系列