这里我想讲清楚code first 数据迁移的两种模式,还有开发环境和生产环境数据迁移的最佳实践。

1.1 数据迁移综述

EF Code first 虽然已经有了几种不同的数据库初始化策略,但是大部分策略都会造成现有的数据丢失,所以如果我们想更新实体的结构,但是保留数据的话,EF提供了一个数据迁移的工具,它使用了新的数据库初始化策略叫做 MigrateDatabaseToLatestVersion,启用数据迁移之后,需要把数据库初始化策略修改为此策略。

一共有两种迁移模式:

  • Automated Migration
  • Code-based Migration

2.1 Automated Migration 自动化迁移

自动化迁移的配置比较简单,主要分为两个内容:

  1. 开启自动迁移
  2. 修改数据库初始化策略

开启自动迁移可以执行命令

enable-migrations –EnableAutomaticMigration:$true

可以在Configuration.class中手动配置,具体代码可以参考下面的代码

修改数据库自动迁移即下:

  public SchoolDBContext(): base("SchoolDB")
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<SchoolDBContext, EF6Console.Migrations.Configuration>());
}

2.2 Code-based Migration

主要分为以下几个内容:

  1. 启用迁移 :Enable-Migrations
  2. 添加迁移 :Add-Migration
  3. 执行迁移 : Update-Database
  4. 回滚 : update-database -TargetMigration:

Enable-Migrations

启用迁移之后,会在项目中新建 Migrations文件夹,下面有Configuration.class

    internal sealed class Configuration : DbMigrationsConfiguration<EFCodeFirst详细问题.DataBaseEntities>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
ContextKey = "EFCodeFirst详细问题.DataBaseEntities";
} protected override void Seed(EFCodeFirst详细问题.DataBaseEntities context)
{
// This method will be called after migrating to the latest version. // You can use the DbSet<T>.AddOrUpdate() helper extension method
// to avoid creating duplicate seed data.
}
}

可以在构造函数中配置自动迁移,允许数据丢失等内容,重写的Seed方法看注释是在迁移到最后版本之后的执行函数,可以进行初始化数据等操作。

Add-Migration

添加迁移后,在configuration.class同级目录会生成一个升级脚本的C#的表达,其中用两个函数up和down,up是升级操作,down是回滚操作,我们也可以在其中编辑自己的代码,这也是迁移中比较灵活的地方。

  public partial class InitialCreate : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Schools",
c => new
{
SchoolID = c.Int(nullable: false, identity: true),
Name = c.String(),
})
.PrimaryKey(t => t.SchoolID); CreateTable(
"dbo.Students",
c => new
{
StudentID = c.Int(nullable: false, identity: true),
Name = c.String(),
Age = c.Int(nullable: false),
})
.PrimaryKey(t => t.StudentID); } public override void Down()
{
DropTable("dbo.Students");
DropTable("dbo.Schools");
}
}

Update-Database

这个没什么好说的,就是执行数据迁移--updateToLastVersion,有一个点就是在命令后面加上–verbose,可以看见执行的具体的sql脚本,对于定位错误还是很有用的

update-database -TargetMigration: 就是回滚到指定版本,这个还没玩过。

EF Code First 数据迁移配置的更多相关文章

  1. EF Code First 数据迁移操作

    打开执行命令窗体 1.EF Code First创建数据库 PM> Install-Package EntityFramework 2.EF Code First数据库迁移 2.1.生成数据库 ...

  2. EF code First数据迁移学习笔记(转)

    转自:http://www.cnblogs.com/icyJ/p/migration.html 准备工作 1.新建一个控制台项目, 在"程序包管理控制台"执行 Install-pa ...

  3. EF code First数据迁移学习笔记

    准备工作 1.新建一个控制台项目, 在"程序包管理控制台"执行 Install-package EntityFramework  //安装EF环境 2.在项目下新建类(Paper) ...

  4. MVC 使用EF Code First数据迁移之添加字段

    PM> add-migration 20161109   -Force 正在为迁移“20161109”搭建基架.此迁移文件的设计器代码包含当前 Code First 模型的快照.在下一次搭建迁移 ...

  5. EF Code First 数据迁移命令

    只需要开启程序管理控制台(Package Manager Console) 然后输入  Enable-Migrations -ContextTypeName youContextdb(你的数据库上下文 ...

  6. 图文详解 解决 MVC4 Code First 数据迁移

    在使用Code first生成数据库后 当数据库发生更改时 运行程序就会出现数据已更改的问题  这时可以删除数据库重新生成解决 但是之前的数据就无法保留  为了保留之前的数据库数据  我们需要使用到C ...

  7. EF6:编写你自己的code first 数据迁移操作(睡前来一篇,翻译的)

    原英文版由EF团队成员 Rowan Miller 在2013年发表,此处只作翻译备忘. 数据迁移提供了一套强类型API,用于执行通用的操作,比如CreateIndex("dbo.Blogs& ...

  8. 解决 MVC4 Code First 数据迁移 数据库发生更改导致调试失败解决方法(二)

    文章转载自:http://www.cnblogs.com/amoniyibeizi/p/4486617.html 前几天学MVC过程中,遇到更改Model类以后,运行程序就会出现数据已更改的问题导致调 ...

  9. Code First 数据迁移 转

    一.为模型更改设置 Code First 数据迁移 1.工具—>库程序包管理器—>程序包管理器控制台—>输入“Enable-Migrations”  或者 Enable-Migrat ...

随机推荐

  1. 理解WebKit和Chromium: JavaScript引擎简介

    转载请注明原文地址:http://blog.csdn.net/milado_nju 1. 什么是JavaScript引擎 什么是JavaScript引擎?简单来讲,就是能够提供执行JavaScript ...

  2. Linux IPC实践(2) --匿名PIPE

    管道概念 管道是Unix中最古老的进程间通信的形式,我们把从一个进程连接到另一个进程的一个数据流称为一个"管道", 管道的本质是固定大小的内核缓冲区; 如:ps aux | gre ...

  3. javascript之DOM编程改变CSS样式(简易验证码显示)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 【leetcode80】Reverse Vowels of a String(元音字母倒叙)

    题目描述: 写一个函数,实现输入一个字符串,然后把其中的元音字母倒叙 注意 元音字母包含大小写,元音字母有五个a,e,i,o,u 原文描述: Write a function that takes a ...

  5. jenkin插件整理

    分类 plugin名称 wiki地址 源码地址 plugin作用范围 备注 Build Reports构建报告(此类插件用来分析构建结果,比果代码检查,测试CASE分析,并将这些结果以报表,趋势图等形 ...

  6. Eclipse/Myeclipse生成serialVersionUID方法

    serialVersionUID作用: 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性. 如果你修改代码重新部署后出现序列化错误,可以考虑给相应的类增加serialVersio ...

  7. JavaScript进阶(九)JS实现本地文件上传至阿里云服务器

    JS实现本地文件上传至阿里云服务器 前言 在前面的博客< JavaScript进阶(八)JS实现图片预览并导入服务器功能>(点击查看详情)中,实现了JS将本地图片文件预览并上传至阿里云服务 ...

  8. HBase压缩

    Hbase有两种压缩 策略:minor和major.Minor compactions通常选择几个临近的小的storefiles把他们重写成一个.Minors 不会丢掉已删除或者过期的cells,只有 ...

  9. struts2 easyui实现datagrid的crud

    最近两天因为项目需要,接触了easyui,要用它的datagrid实现crud.第一次做,花了一天时间才完成所有功能,昨天做另外一个模块,同样的功能只用了两个小时. 现在把第一次做datagrid时遇 ...

  10. java 项目得到jar和classes路径

    java 项目得到jar和classes路径 public static String getJarPath(Class clazz) { String path = clazz.getProtect ...