qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

CodeFirstMigrations更新数据库结构

  背景
  code first起初当修改model后,要持久化至数据库中时,总要把原数据库给删除掉再创建(DropCreateDatabaseIfModelChanges),此时就会产生一个问题,当我们的旧数据库中包含一些测试数据时,当持久化更新后,原数据将全部丢失,故我们可以引入EF的数据迁移功能来完成。
  要求
  已安装NuGet
  过程示例
//原model
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
public class Lesson {
public int lessonID { get; set; }
[Required]
[MaxLength(50)]
public string lessonName { get; set; }
[Required]
public string teacherName { get; set; }
public virtual UserInfo UserInfo{get;set;}
}
//新model
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
public class Lesson {
public int lessonID { get; set; }
[Required]
[MaxLength(50)]
public string lessonName { get; set; }
[Required]
[MaxLength(10)]
public string teacherName { get; set; }
public virtual UserInfo UserInfo{get;set;}
}
  注:区别在于,我们给teacherName属性加了一个长度限制。
  接下来,我们将开始持久化此model至数据库中(我们现在只是对属性作修改,此时数据库中此字段的长度为nvarchar(max),并不是nvarchar(10))
  1:在config中配置数据库连接:
  <connectionStrings>
  <add name="TestUsersDB" connectionString="Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=TestUsersDB;Data Source=XCL-PC\SQLEXPRESS" providerName="System.Data.SqlClient" />
  </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,将作出如下修改:
  public Configuration()
  {
  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
  数据库中的原数据也没有丢失!

posted on 2014-07-21 09:55 顺其自然EVO 阅读(330) 评论(0)  编辑  收藏 所属分类: 测试学习专栏


只有注册用户登录后才能发表评论。


网站导航:
 
<2014年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜