EF-CodeFirst-数据迁移
数据迁移
之前说到Code-First中有不同的数据库初始化策略,如CreateDatabaseIfNotExists,DropCreateDatabaseIfModelChanges和DropCreateDatabaseAlways。但是,这些策略存在一些问题,例如,数据库中已经有数据(种子数据除外)或现有的存储过程,触发器等。这些策略用于删除整个数据库并重新创建它,因此将丢失数据和其他数据库对象。
EF引入了一种迁移工具,可在模型更改时自动更新数据库模式,而不会丢失任何现有数据或其他数据库对象。它使用一个名为MigrateDatabaseToLatestVersion的新数据库初始化程序
有两种迁移方式:
- 自动迁移
- 基于代码的迁移
自动迁移
自动迁移可以通过enable-migrations在软件包管理器控制台中执行命令来实现。打开包管理器控制台,然后运行enable-migrations –EnableAutomaticMigration:$true命令(确保默认项目是上下文类所在的项目)。一旦命令成功运行,它将创建一个Configuration从项目DbMigrationConfiguration中的Migration文件夹派生的内部密封类

因为将数据上下文类放到了EntityFramework.Print项目中,故报这个错误;调整一下
Configuration类的构造函数中,AutomaticMigrationsEnabled设置为true。启用自动迁移,下一步是将上下文类中的数据库初始化程序设置为MigrateDatabaseToLatestVersion,如下所示。
删除数据库重新运行,第一次:

修改域模型,并重新添加新数据


Dept表已经根据域模型自动更新了,Person表中原先的数据也没有丢失
基于代码的迁移
基于代码的迁移提供了对迁移的更多控制,并允许配置其他内容,例如设置列的默认值,配置计算列等。为了使用基于代码的迁移,需要在Visual Studio的包管理器控制台中执行以下命令:
- Enable-Migrations: 创建Configuration类启用项目中的迁移.
- Add-Migration: 使用Up()和Down()方法根据指定的名称创建新的迁移类.
- Update-Database:执行由该Add-Migration命令创建的上一个迁移文件,并将更改应用于数据库模式。

和自动迁移区别AutomaticMigrationsEnabled=false;
使用Add-Migration带有迁移类名称的命令创建迁移类,如下所示。
图中Up()方法包含用于创建数据库对象的Down()代码,该方法包含用于删除或删除数据库对象的代码。您也可以编写自己的自定义代码以进行其他配置。这比自动迁移更有优势。
使用add-migration命令创建迁移文件后,必须更新数据库。执行Update-Database命令来创建或修改数据库模式。使用该–verbose选项查看要应用于目标数据库的SQL语句。

数据库已经被更新

回滚迁移
假设想要将数据库模式回滚到之前的任何状态,那么可以update-database使用–TargetMigration参数执行命令,使其返回到想要回滚的点。例如,假设有许多迁移应用于上面的EntityFramework.Base数据库,但您想要回滚到第一个迁移。然后执行以下命令。
update-database -TargetMigration:Base-v1
种子数据
可以在数据库初始化过程中将数据插入数据库表中。比如在数据初始化时给应用程序提供一些测试数据

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">
EF-CodeFirst-数据迁移的更多相关文章
- EF Code-First数据迁移
Code-First数据迁移 首先要通过NuGet将EF升级至最新版本. 新建MVC 4项目MvcMigrationDemo 添加数据模型 Person 和 Department,定义如下: usi ...
- 【EF】EF Code-First数据迁移
Code-First数据迁移 首先要通过NuGet将EF升级至最新版本. 新建MVC 4项目MvcMigrationDemo 添加数据模型 Person 和 Department,定义如下: usi ...
- EF Code-First数据迁移的尝试
Code-First的方式虽然省去了大量的sql代码,但增加了迁移的操作.尝试如下: 1.首先要在“扩展管理器”里搜索并安装NuGet“库程序包管理器”,否则所有命令都不能识别,会报CommandNo ...
- EF CodeFirst数据迁移与防数据库删除
1 开启migrations功能 enable-migrations -force 2 添加迁移版本 add-migration 名称后缀 我们每次修改实体后,都应该使用这个add-migration ...
- Entity Framework CodeFirst数据迁移
前言 紧接着前面一篇博文Entity Framework CodeFirst尝试. 我们知道无论是“Database First”还是“Model First”当模型发生改变了都可以通过Visual ...
- [EF Core]数据迁移(二)
摘要 在实际项目中,大多都需要对业务逻辑以及操作数据库的逻辑进行分成操作,这个时候该如何进行数据的迁移呢? 步骤 上篇文章:EF Core数据迁移操作 比如,我们将数据上下文放在了Data层. 看一下 ...
- EF架构~CodeFirst数据迁移与防数据库删除
回到目录 本文介绍两个概念,防数据库自动删除,这是由于在code first模式下,当数据实体发生变化时,会对原来数据库进行删除,并将新数据表添加进来,但这对于我们的运营环境数据库,是万万不能接受的, ...
- codefirst数据迁移技术,在保留数据库数据下实现对模型的修改并映射到数据库
一前言 这是我的处女作,写的不好的地方还望指出共同讨论.EF的数据访问方式有三种DbFirst,ModelFirst,还有本文要提到的CodeFirst 三者都是以ORM的方式建立.本人之前学习的.n ...
- ASP.NET Core ef启用数据迁移
创建一个项目 通过Nuget获取EF Core相关的扩展包 appsettings.json 建立数据库连接串 创建数据库上下文EntityDbContext类,用于实体类映射数据库表 使用包管理器控 ...
- EF Core数据迁移操作
摘要 在开发中,使用EF code first方式开发,那么如果涉及到数据表的变更,该如何做呢?当然如果是新项目,删除数据库,然后重新生成就行了,那么如果是线上的项目,数据库中已经有数据了,那么删除数 ...
随机推荐
- N个降序数组,找到最大的K个数
问题定义 这个问题来自网上看到的百度算法题,感觉很不错,问题定义如下: 假定有20个有序数组,每个数组有500个数字,降序排列,数字类型32位uint数值,现在需要取出这10000个数字中最大的500 ...
- linux每日命令(24):Linux 目录结构
一. 简介 对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只 ...
- TCP/IP协议理解
TCP/IP协议理解 一. 协议分层 由于ISO标准中的网络模型是个7层模型,但是由于7层模型对于当时的网络厂商来说太过复杂,很多厂家采用了简化的4层模型来实现网络设备,4层模型也就成了事实的网 ...
- 《软件测试自动化之道》读书笔记 之 基于反射的UI测试
<软件测试自动化之道>读书笔记 之 基于反射的UI测试 2014-09-24 测试自动化程序的任务待测程序测试程序 启动待测程序 设置窗体的属性 获取窗体的属性 设置控件的属性 ...
- java框架篇---Struts2 本地化/国际化(i18n)
国际化(i18n)是规划和实施的产品和服务,使他们能很容易地适应特定的本地语言和文化的过程中,这个过程被称为本地化.国际化的过程有时也被称为翻译或本地化启用.国际化是缩写i18n,因为我和两端用n字打 ...
- tomcat启动时非常慢,启动时 一直卡在Root WebApplicationContext: initialization completed
每次重启自己的服务tomcat都需要卡住很长时间,每次都是日志停在 Root WebApplicationContext: initialization completed in 744 ms这个地方 ...
- Go_14:GoLang中 json、map、struct 之间的相互转化
1. golang 中 json 转 struct <1. 使用 json.Unmarshal 时,结构体的每一项必须是导出项(import field).也就是说结构体的 key 对应的首字母 ...
- hdoj:2042
#include <iostream> using namespace std; int main() { int n,a; while (cin >> n) { while ...
- Linux磁盘概念及其管理工具fdisk
Linux磁盘概念及其管理工具fdisk [日期:2016-08-27] 来源:Linux社区 作者:chawan [字体:大 中 小] 引言:冯诺依曼体系中的数据存储器就是我们常说的磁盘或硬盘 ...
- Scala学习笔记——断言和单元测试
1.断言 assert(conditon)将在条件不成立的时候,抛出assertionError assert(conditon,explanation)讲在条件不成立的时候,抛出explanatio ...