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

背景

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


要求
  1. 已安装NuGet
过程示例
  1. //原model  
  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. }  
  1. //新model  
  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中配置数据库连接:

  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

可能会出现如下错误:

  • {  
  •     AutomaticMigrationsEnabled = true;  
  • }  


再次执行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



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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。