重置EntityFramework数据迁移到洁净状态

简介: 前言 翻译一篇有关EF数据迁移的文章,以备日后所用,文章若有翻译不当的地方请指出,将就点看,废话少说,看话题。【注意】:文章非一字一句的翻译,就重要的问题进行解释并解决。 话题引入 无法确定这种场景是否是大家也遇见过并且是频繁出现的,这种场景通常出现在需要对大量的数据进行迁移,导致EF数据迁移使得EF迁移状态呈现出一种不可用的状态,最终出现在新的数据迁移上无法进行更新数据库或者回滚。

前言

翻译一篇有关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比较工具来进行比对。

 

目录
相关文章
42Echarts - 柱状图(坐标轴刻度与标签对齐)
42Echarts - 柱状图(坐标轴刻度与标签对齐)
541 0
|
小程序 JavaScript 前端开发
ssm+vue基本微信小程序的考试刷题及分析系统小程序
随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代,考试刷题及分析系统小程序就是信息时代变革中的产物之一。 任何系统都要遵循系统设计的基本流程,本系统也不例外,同样需要经过市场调研,需求分析,概要设计,详细设计,编码,测试这些步骤,基于Java语言、微信小程序技术设计并实现了考试刷题及分析系统小程序。系统主要包括系统首页、个人中心、用户管理、试卷管理、试题管理、系统管理、考试管理等功能模块。
302 0
|
开发者 Python
贪婪和⾮贪婪模式 | 手把手教你入门Python之九十一
Python⾥数量词默认是贪婪的(在少数语⾔⾥也可能是默认⾮贪婪),总是尝试匹配尽可能多的字符;⾮贪婪则相反,总是尝试匹配尽可能少的字符。
|
负载均衡 应用服务中间件 Linux
Linux安装配置反向代理Nginx
应用场景 对于一个大型网站来说,负载均衡是永恒的话题,顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。
1205 0
|
关系型数据库 MySQL 测试技术
|
14天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
6天前
|
云安全 人工智能 安全
Dify平台集成阿里云AI安全护栏,构建AI Runtime安全防线
阿里云 AI 安全护栏加入Dify平台,打造可信赖的 AI
|
9天前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
856 31