Code First Migrations更新数据库结构(数据迁移)

Posted 天道酬勤!!!

tags:

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

背景

code first起初当修改model后,要持久化至数据库中时,总要把原数据库给删除掉再创建(DropCreateDatabaseIfModelChanges),此时就会产生一个问题,当我们的旧数据库中包含一些测试数据时,当持久化更新后,原数据将全部丢失,故我们可以引入EF的数据迁移功能来完成。

 

要求

 

  1. 已安装NuGet

 

过程示例
[csharp] view plain copy
 
  1. //原model  
[csharp] view plain copy
 
  1. using System.Collections;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel.DataAnnotations;  
  4. public class Lesson {  
  5.     public int lessonID { get; set; }  
  6.     [Required]  
  7.     [MaxLength(50)]  
  8.     public string lessonName { get; set; }  
  9.     [Required]  
  10.     public string teacherName { get; set; }  
  11.     public virtual UserInfo UserInfo{get;set;}  
  12. }  
[csharp] view plain copy
 
  1. //新model  
[csharp] view plain copy
 
  1. using System.Collections;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel.DataAnnotations;  
  4. public class Lesson {  
  5.     public int lessonID { get; set; }  
  6.     [Required]  
  7.     [MaxLength(50)]  
  8.     public string lessonName { get; set; }  
  9.     [Required]  
  10.     [MaxLength(10)]  
  11.     public string teacherName { get; set; }  
  12.     public virtual UserInfo UserInfo{get;set;}  
  13. }  

注:区别在于,我们给teacherName属性加了一个长度限制。

 

接下来,我们将开始持久化此model至数据库中(我们现在只是对属性作修改,此时数据库中此字段的长度为nvarchar(max),并不是nvarchar(10))

 

1:在config中配置数据库连接:

 

[html] view plain copy
 
  1. <connectionStrings>  
  2.   <add name="TestUsersDB" connectionString="Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=TestUsersDB;Data Source=XCL-PC\SQLEXPRESS" providerName="System.Data.SqlClient" />  
  3. </connectionStrings>  

 

 

2:打开NuGet控制台:

 

技术分享

 

 

3:运行命令Enable-Migrations

可能会出现如下错误:

Checking if the context targets an existing database...
Detected database created with a database initializer. Scaffolded migration ‘201212090821166_InitialCreate‘ corresponding to existing database. To use an automatic migration instead, delete the Migrations folder and re-run Enable-Migrations specifying the -EnableAutomaticMigrations parameter.
Code First Migrations enabled for project MvcApplication1.

此时项目会出现如下文件夹:

 

技术分享

打开configuation.cs,将作出如下修改:

 

[csharp] view plain copy
 
  1. public Configuration()  
  2. {  
  3.     AutomaticMigrationsEnabled = true;  
  4. }  


再次执行Update-Database:

 

因为我把长度从max改为10,在更新数据结构时,它认为此操作会导致数据丢失,如下:

Specify the ‘-Verbose‘ flag to view the SQL statements being applied to the target database.
No pending code-based migrations.
Applying automatic migration: 201212090848057_AutomaticMigration.
Automatic migration was not applied because it would result in data loss.

如果确保没事,只需给此命令加个强制执行的参数即可:

Enable-Migrations -Force

最后再次执行:Update-Database

技术分享

 

数据库中的原数据也没有丢失!

以上是关于Code First Migrations更新数据库结构(数据迁移)的主要内容,如果未能解决你的问题,请参考以下文章

Code First Migrations更新数据库结构(数据迁移)

Code First 下自动更新数据库结构(Automatic Migrations)

“Code First Migrations ”工具

EF Code First Database Initializer和Migrations Confusion

EF Code First Migrations数据库迁移

EF Code First Migrations数据库迁移