重置EntityFramework数据迁移到洁净状态
前言
翻译一篇有关EF数据迁移的文章,以备日后所用,文章若有翻译不当的地方请指出,将就点看,废话少说,看话题。【注意】:文章非一字一句的翻译,就重要的问题进行解释并解决。
话题引入
无法确定这种场景是否是大家也遇见过并且是频繁出现的,这种场景通常出现在需要对大量的数据进行迁移,导致EF数据迁移使得EF迁移状态呈现出一种不可用的状态,最终出现在新的数据迁移上无法进行更新数据库或者回滚。也就是说当进行数据迁移时有可能导致数据库和EF架构出现不一致的状态即所谓的异步,接下来我们将一步一步来解决这个问题。
温馨提示:如果你确定要走重置数据迁移的路线,请确保备份你的代码以及数据库,以防出现的架构非你所预期,当然了,EF代码生成器和架构匹配的如此完美,在数据库中亦是如此,但是以防失效并且你不想在没有备份的情况下陷入绝境,为什么这样说呢?在迁移里,你可能有你自定义的代码,此时将需要额外的工作来更新数据库,此时无法保证这样的工作是否能成功完成,所以为了安全,归根结底,请备份。
移除和重置数据迁移
step one
删除我们进行数据迁移在数据库中生成的表,如下:

首先删除_MigrationHistory 表,通过删除迁移记录表来告诉数据迁移已经被应用,如果这个表一直存在,EF将检测最新的版本的数据迁移是否已经被应用上,与此同时如果成功了则会抛出数据库和EF架构不同步的错误,如果你删除了这个表,EF将不会去检测架构是否匹配
step two
删除项目中的数据迁移。如下:

我们需要留下Configuration.cs文件,因为它可能包含初始化数据添加代码,当然你没有需要初始化的数据代码,我们也可以删除这个文件或者整个文件夹。此时我们运行这个应用程序将不会出现任何差错,因为此时在数据库中没有任何数据迁移表以及在项目中没有迁移文件
step three
通过【Enable-Migrations】重新创建数据迁移
若未完全删除整个项目的数据迁移文件夹则需要用上【Enable-Migrations -Force】命令
step four
通过【Add-Migration Initial】进行初始化数据迁移。
创建的文件里包含Up和Down方法定义了数据库的架构
基于表的DbContext和Model类创建了表和外键以及其他约束的命令,EF通过DbContext找到每个Model类,指出其关系和外键并且通过应用定义在Model类的特性设置,最终以代码来描述他们,此时你将看到如下

step five
通过【Update-Database】命令更新到数据库
此时你通过此命令来更新到数据库则出现【数据库已存在某表的对象】,此时为了解决这一点,我们可以通过注释UP方法来伪造出迁移。在UP方法上加上【return】即可(注意:完成后删除return,此时则回到了同步状态),如下:

此时再来运行【Update-Database】命令即可成功,如下:

finally
最后一步相对来说是最笨重也是繁重的,通过使用【Update-Database -script】来对本地和远程的数据库进行更新。最终将使得数据库与EF架构处于同步的状态。当然你觉得有些不对劲你可以通过VS中的SQL Server架构比较工具或者是Red Gate's 非常棒的SQL比较工具来进行比对。
重置EntityFramework数据迁移到洁净状态的更多相关文章
- EntityFramework数据迁移(笔记)
1.启用迁移 在Package Manager Console中运行Enable-Migrations命令 此命令已将Migrations文件夹添加到我们的项目中,此新文件夹包含两个文件: Confi ...
- C#+EntityFramework编程方式详细之Code First 数据迁移
在前几篇的C#+EntityFramework编程方式中介绍了C#+EntityFramework编程方式Code First ,Model First以及Dtatabase First 等编程方式, ...
- EntityFramework Code First便捷工具——数据迁移
使用EntityFramework Code First开发,数据迁移是一个不得不提的技术. 在我们的开发过程中,难免需要对模型进行改进,模型改进后,会导致实体集与数据库不一致,当然我们可以通过删除数 ...
- EntityFramework Code First 模式下使用数据迁移
启用数据迁移 在程序包管理控制台选择安装了EntityFramework的项目,键入如下指令以启EF用数迁移. Enable-Migrations 命令成功运行后,所选项目下会添加名为Migratio ...
- 【开源】OSharp框架解说系列(5.2):EntityFramework数据层实现
OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...
- EntityFramework 7 更名为EntityFramework Core(预发布状态)
前言 最近很少去学习和探索新的东西,尤其是之前一直比较关注的EF领域,本身不太懒,但是苦于环境比较影响自身的心情,所以迟迟没有下笔,但是不去学习感觉在精神层面缺少点什么,同时也有园友说EF又更新了,要 ...
- Entity Framework7 入门之全功能.NET版本下使用EF7(含源码)另附数据迁移常见错误处理
Entity Framework7 入门之全功能.NET(Console, WinForms, WPF等)使用EF7 昨天,我们介绍了EF的新特性和开发计划,如果你还不了解,请移步 Entity Fr ...
- Entity Framework Code First Migrations--EF 的数据迁移
1. 为了演示方便,首先新建一个控制台项目,然后添加对entityframework的引用 使用nuget控制台执行: Install-Package EntityFramework 2.新建一个实体 ...
- 【开源】OSharp框架解说系列(5.1):EntityFramework数据层设计
OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...
随机推荐
- 非交织YUV格式转换
本文为自己写的从非交织yuv420转换出yuv444,yuv422h,yuv422v和手动裁剪422h,422v图片的代码 #include <fcntl.h> #include < ...
- Map的keySet和entrySet
/*Map集合的两种 取出方式 * 1.keySet() * 2.entrySet() * */ //定义一个学生类 重写了equals.hashcode三个方法,实现了comparable接口并覆盖 ...
- 【luogu】 P1880 石子合并
原题原题原题原题原题 先贴上错误代码... ↓错误代码↓ #include <iostream> #include <cstdio> #include <cstring& ...
- cordova插件开发注意事项
1. 编写插件,先创建好cordova项目之后,在项目里开发调试好在去创建插件目录 如何在cordova项目里创建呢,在android文件夹下面的res/xml/config.xml里去加入插件 例如 ...
- bzoj3648: 寝室管理(环套树+点分治)
好题..写了两个半小时hh,省选的时候要一个半小时内调出这种题目还真是难= = 题目大意是给一棵树或环套树,求点距大于等于K的点对数 这里的树状数组做了一点变换.不是向上更新和向下求和,而是反过来,所 ...
- 利用@media screen实现网页布局的自适应
利用@media screen实现网页布局的自适应 优点:无需插件和手机主题,对移动设备友好,能够适应各种窗口大小.只需在CSS中添加@media screen属性,根据浏览器宽度判断并输出不同的长宽 ...
- WPF整理-跨程序集访问资源
“Sometimes binary resources are defined in one assembly (typically a class library), but areneeded i ...
- 执行CSRF令牌所有形式使用POST方法
从而在并未授权的情况下执行在权限保护之下的操作,有很大的危害性. php CSRF Guardfunction csrfguard_generate_token($unique_form_name){ ...
- 推荐几个Android自定义的进度条(转载)
CustomLoading ElasticDownload Circle-Progress-View lzyzsdCircleProgress SquareProgressBar materialis ...
- WPF TextBox 搜索框 自定义
更多资源:http://denghejun.github.io <Style x:Key="SearchTextBoxStyle" BasedOn="{x:Null ...