EF Code First 数据迁移配置
这里我想讲清楚code first 数据迁移的两种模式,还有开发环境和生产环境数据迁移的最佳实践。
1.1 数据迁移综述
EF Code first 虽然已经有了几种不同的数据库初始化策略,但是大部分策略都会造成现有的数据丢失,所以如果我们想更新实体的结构,但是保留数据的话,EF提供了一个数据迁移的工具,它使用了新的数据库初始化策略叫做 MigrateDatabaseToLatestVersion,启用数据迁移之后,需要把数据库初始化策略修改为此策略。
一共有两种迁移模式:
- Automated Migration
- Code-based Migration
2.1 Automated Migration 自动化迁移
自动化迁移的配置比较简单,主要分为两个内容:
- 开启自动迁移
- 修改数据库初始化策略
开启自动迁移可以执行命令
enable-migrations –EnableAutomaticMigration:$true
可以在Configuration.class中手动配置,具体代码可以参考下面的代码
修改数据库自动迁移即下:
public SchoolDBContext(): base("SchoolDB")
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<SchoolDBContext, EF6Console.Migrations.Configuration>());
}
2.2 Code-based Migration
主要分为以下几个内容:
- 启用迁移 :Enable-Migrations
- 添加迁移 :Add-Migration
- 执行迁移 : Update-Database
- 回滚 : 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 数据迁移配置的更多相关文章
- EF Code First 数据迁移操作
打开执行命令窗体 1.EF Code First创建数据库 PM> Install-Package EntityFramework 2.EF Code First数据库迁移 2.1.生成数据库 ...
- EF code First数据迁移学习笔记(转)
转自:http://www.cnblogs.com/icyJ/p/migration.html 准备工作 1.新建一个控制台项目, 在"程序包管理控制台"执行 Install-pa ...
- EF code First数据迁移学习笔记
准备工作 1.新建一个控制台项目, 在"程序包管理控制台"执行 Install-package EntityFramework //安装EF环境 2.在项目下新建类(Paper) ...
- MVC 使用EF Code First数据迁移之添加字段
PM> add-migration 20161109 -Force 正在为迁移“20161109”搭建基架.此迁移文件的设计器代码包含当前 Code First 模型的快照.在下一次搭建迁移 ...
- EF Code First 数据迁移命令
只需要开启程序管理控制台(Package Manager Console) 然后输入 Enable-Migrations -ContextTypeName youContextdb(你的数据库上下文 ...
- 图文详解 解决 MVC4 Code First 数据迁移
在使用Code first生成数据库后 当数据库发生更改时 运行程序就会出现数据已更改的问题 这时可以删除数据库重新生成解决 但是之前的数据就无法保留 为了保留之前的数据库数据 我们需要使用到C ...
- EF6:编写你自己的code first 数据迁移操作(睡前来一篇,翻译的)
原英文版由EF团队成员 Rowan Miller 在2013年发表,此处只作翻译备忘. 数据迁移提供了一套强类型API,用于执行通用的操作,比如CreateIndex("dbo.Blogs& ...
- 解决 MVC4 Code First 数据迁移 数据库发生更改导致调试失败解决方法(二)
文章转载自:http://www.cnblogs.com/amoniyibeizi/p/4486617.html 前几天学MVC过程中,遇到更改Model类以后,运行程序就会出现数据已更改的问题导致调 ...
- Code First 数据迁移 转
一.为模型更改设置 Code First 数据迁移 1.工具—>库程序包管理器—>程序包管理器控制台—>输入“Enable-Migrations” 或者 Enable-Migrat ...
随机推荐
- try、catch、finally 块的关系
try.catch.finally 块的关系 try块不能单独存在,后面必须跟catch块或者finally块. 三者之间的组合为:try-catch.try-catch-finally.try-fi ...
- Dynamics CRM 导入用户数据错误 could not retrieve salesperson role
在CRM中通过导入数据的方式创建用户时报下图中的错误,"could not retrieve saleperson role".原因是系统中的自带的salesperson安全角色被 ...
- (Tomcat)服务器之web应用的虚拟目录映射和主机搭建
首先来了解一下web的虚拟目录映射和主机搭建的知识 第一:web的虚拟目录映射 首先我们要知道什么叫做web的虚拟目录映射,这个很好理解的,就是将我们本地硬盘上的web应用映射出一个供外界用户访问的地 ...
- ROS_Kinetic_09 ROS基础内容(四)
ROS_Kinetic_09 ROS基础内容(四) 参考网址: http://wiki.ros.org/cn/ROS/Tutorials/UsingRosEd http://wiki.ros.org/ ...
- xml作用以及语法
2 XML作用 2.1 描述带关系的数据(软件的配置文件) web服务器(PC): 学生管理系统 -> 添加学生功能 -> 添加学生页面 -> name=eric&email ...
- C语言之free函数及野指针
[FROM MSDN && 百科] 原型: void free(void *ptr); #include<stdlib.h>或#include <malloc.h& ...
- 用Fiddler在Android上抓包(Http+https)
Fiddler是一个HTTP协议调试代理工具,在开发网络应用的时候经常会用到,其最基本的作用是能抓HTTP的数据包,当然它还有更高级的用法,如添加断点.修改请求与相应的数据等等... 抓HTTP包 安 ...
- Linux Shell -- 无网不利
这篇文章中我介绍几个非常实用的和网络相关的命令 一.ifconfig 这个命令在Windows下被"翻译为ipconfig",它用于显示网络接口,子网掩码等详细信息. 注:在每个系 ...
- URLClassLoader
package com.reflect.load; import java.net.URL; import java.net.URLClassLoader; import java.sql.Conne ...
- 《java入门第一季》之面向对象(匿名内部类)
1.认识匿名内部类 /* 匿名内部类 就是内部类的简化写法. 前提:存在一个类或者接口 这里的类可以是具体类也可以是抽象类. 匿名内部类的格式: new 类名或者接口名(){ 重写方法; }:这代表的 ...