前言

翻译一篇有关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数据迁移到洁净状态的更多相关文章

  1. EntityFramework数据迁移(笔记)

    1.启用迁移 在Package Manager Console中运行Enable-Migrations命令 此命令已将Migrations文件夹添加到我们的项目中,此新文件夹包含两个文件: Confi ...

  2. C#+EntityFramework编程方式详细之Code First 数据迁移

    在前几篇的C#+EntityFramework编程方式中介绍了C#+EntityFramework编程方式Code First ,Model First以及Dtatabase First 等编程方式, ...

  3. EntityFramework Code First便捷工具——数据迁移

    使用EntityFramework Code First开发,数据迁移是一个不得不提的技术. 在我们的开发过程中,难免需要对模型进行改进,模型改进后,会导致实体集与数据库不一致,当然我们可以通过删除数 ...

  4. EntityFramework Code First 模式下使用数据迁移

    启用数据迁移 在程序包管理控制台选择安装了EntityFramework的项目,键入如下指令以启EF用数迁移. Enable-Migrations 命令成功运行后,所选项目下会添加名为Migratio ...

  5. 【开源】OSharp框架解说系列(5.2):EntityFramework数据层实现

    OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...

  6. EntityFramework 7 更名为EntityFramework Core(预发布状态)

    前言 最近很少去学习和探索新的东西,尤其是之前一直比较关注的EF领域,本身不太懒,但是苦于环境比较影响自身的心情,所以迟迟没有下笔,但是不去学习感觉在精神层面缺少点什么,同时也有园友说EF又更新了,要 ...

  7. Entity Framework7 入门之全功能.NET版本下使用EF7(含源码)另附数据迁移常见错误处理

    Entity Framework7 入门之全功能.NET(Console, WinForms, WPF等)使用EF7 昨天,我们介绍了EF的新特性和开发计划,如果你还不了解,请移步 Entity Fr ...

  8. Entity Framework Code First Migrations--EF 的数据迁移

    1. 为了演示方便,首先新建一个控制台项目,然后添加对entityframework的引用 使用nuget控制台执行: Install-Package EntityFramework 2.新建一个实体 ...

  9. 【开源】OSharp框架解说系列(5.1):EntityFramework数据层设计

    OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...

随机推荐

  1. 如何设置GridView中某个字段显示数据的一部分?

    后台方法: /// <summary> /// 截取字符串 /// </summary> /// <param name="str">要截取的字 ...

  2. js知识点

    在变量复制方面,基本类型和引用类型也有所不同,基本类型复制的是值本身,而引用类型复制的是地址. 循环引用 一个很简单的例子:一个DOM对象被一个Javascript对象引用,与此同时又引用同一个或其它 ...

  3. zend studio8编辑器乱码问题解决办法

    截图一张:

  4. Page

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> <met ...

  5. ELK+Kafka集群日志分析系统

    ELK+Kafka集群分析系统部署 因为是自己本地写好的word文档复制进来的.格式有些出入还望体谅.如有错误请回复.谢谢! 一. 系统介绍 2 二. 版本说明 3 三. 服务部署 3 1) JDK部 ...

  6. Server.Transfer 和 Response.Redirect 用法区别

    在ASP.NET中,在后台传值方式目前大多都是用 Response.Redirect("页面地址") 来重定向页面的,但是现在还有一种方式也可以达到重定向页面的作用,而且在某些时刻 ...

  7. web api Route属性定义

    ASP.NET Web API路由,简单来说,就是把客户端请求映射到对应的Action上的过程.在"ASP.NET Web API实践系列03,路由模版, 路由惯例, 路由设置"一 ...

  8. IRP完成例程返回值理解

    第一,完成例程里面直接返回STATUS_SUCCESS,这时候IRP已经继续向上回卷,失去了对IRP的控制. 第二,完成例程里面返回STATUS_MORE_PROCESSING_REQUIRED,仍具 ...

  9. Excel VBA 函数

    Instr函数 一. 定义 InStr 函数 返回 Variant (Long),指定一字符串在另一字符串中最先出现的位置. InStr([start, ]string1, string2[, com ...

  10. SQLPrompt 7.2发布

    SQLPrompt 7.2发布 下载地址:http://www.red-gate.com/products/sql-development/sql-prompt/ 红门的热门产品SQLPrompt 发 ...