记录一次EFCore CodeFirst迁移实践,解决多个项目表结构同步更新问题

背景:

  项目中使用的是EFCore2.1的DbFirst模式,但由于多个项目使用了相同的基础框架,每次同步更新数据库结构很麻烦,因此同时使用了CodeFirst来进行迁移实现同步。其中,项目A的数据库版本为最新,项目B为旧,现要自动将B项目的数据库结构和A项目保持一致。

过程介绍:

  首先要知道,CodeFirst中的Update-database可以实现数据库的创建和结构更新,但结构更新必须有前一次的迁移记录,否则无法自动比对变化,也就无法进行准确的升级更新。

项目B正是这样,从未进行过迁移,因此,需要先生成初始化迁移记录,为下一步的更新做准备:

(1)在程序控制台中执行指令  Add-migration ProjectB_DatabaseInit  -c DefaultContext。  其中,-c DefaultContext是因为我的项目中有多个Context,所以要声明

(2)可以看到项目中出现了MIgrations文件夹,以及对应的迁移记录文件。

(3)执行后Update-database ProjectB_DatabaseInit  -c DefaultContext,会提示“数据库中对象XXX已存在”的错误,这是因为数据库已存在了,而由于刚才是第一次执行Migration,所以示为创建数据库及表,这就导致了冲突。

(4)打开Migrations文件夹中的迁移记录文件,其中有Up和Down两个方法,其中Up方法中的内容主要是进行创建表的, 把里面在数据库中已存在表的CreateTable语句删除掉(或者直接把Up方法下的代码全删掉,Up方法保留)

(5)重新执行Update-database ProjectB_DatabaseInit  -c DefaultContext,成功后在数据库中有一个新的表:_EFMigrationsHistory,可以查看到迁移记录。

注意:这个日志记录和Migrations文件夹中的迁移记录文件是对应的,如果没用特殊情况,请不要删除任何一个,否则会导致后续迁移失败。

(6)通过以上步骤,我们就完成了已有表数据库的初始化迁移记录的创建,为后续同步做好了准备。

(7)由于迁移的基础是DBContext和Model,所以把项目B中的Context和Model文件都和项目A保持一致(Context和Model是使用EFCore-DBFirst Scafolding生成的,复制粘贴都会吧),然后在程序控制台中执行指令  Add-migration ProjectB_DatabaseUpdate  -c DefaultContext

(8)再执行Update-database ProjectB_DatabaseUpdate  -c DefaultContext

(9)执行完成后查看数据库表,发现已经同步了。

总结:

  (1)以上场景虽然比较特殊,但可以帮助我们更好的理解CodeFirst的迁移原理。

(2)Add-Migration生成的迁移文件用于指导Update-database的执行,所以可以通过修改迁移文件来更灵活的进行迁移

(3)DbFirst和CodeFirst各有好处,可同时使用,发挥特点

(4)CodeFirst可以帮我们快速创建数据库,特别是对于不同版本、类型的数据库环境中快速创建表结构。也可以借助CodeFirst生成Sql语句来创建: Script-Migration -Output D:\InitialCreate.sql

(5)如果要反转迁移(即撤销本次迁移),使用 Remove-Migration  -c  DefaultContext ,如果有多个迁移版本,则执行多次此指令,会按远近依次删除迁移文件。如果迁移已经Update到了数据库,则要在数据库中找到_EFMigration表并删除其中的记录,之后再Remove-Migration

尾声:无图才是纯干货

原文地址:https://www.cnblogs.com/cdoneiX/p/12306325.html

时间: 2024-08-06 15:54:09

记录一次EFCore CodeFirst迁移实践,解决多个项目表结构同步更新问题的相关文章

不同类型的数据跨表空间迁移的解决办法

http://blog.csdn.net/passion_wang/article/details/6541369 Oracle10g数据跨表空间迁移 因某些开发人员由于对oracle数据库理解的不够深入,往往在建表的时候指定了当前用户非默认的表空间,这样就导致了在exp及imp等操作时候问题很多,因此需要将这些表及相关的数据迁移回当前用户的默认表空间里.Oracle10g数据数据库提供了一个Move命令可以把这样的数据对象进行跨表空间的迁移,也可以对含有BLOB.CLOB这样的二进制大字段的表

糗百的数据迁移实践

糗事百科(以下简称"糗百")被誉为移动互联网时代的新娱乐手段,其上海量真实用户的糗事深受喜爱,每天有1亿次动态请求,峰值请求数为每秒30000次.面对如此高的并发访问量,糗百原来自建的平台越来越难以支撑,开始出现服务器过载.跨机房同步延时大.图片中心磁盘I/O成为瓶颈等问题. 为了解决这些刚性的服务压力,优化用户的服务体验,并考虑到七牛对静态资源存储的强大技术实力和优秀的解决方案,糗百决定将图片存储迁移到七牛平台上,并开始使用七牛提供的CDN服务.本文将结合糗百的数据迁移实践,来详细讲

【转帖】从 Oracle 到 PostgreSQL ,某保险公司迁移实践 技术实践

从 Oracle 到 PostgreSQL ,某保险公司迁移实践 http://www.itpub.net/2019/11/08/4108/ 信泰人寿保险股份有限公司 摘要:去O一直是金融保险行业永恒的话题,但去O的难度之大也只有真正经历过的人才知其中的艰辛.此次笔者结合实际去O工作,对去O过程中碰到的DBLINK.SEQUENCE最大值.空串.SQL语句中的别名等等近50个问题进行探讨,绝对是干货满满,诚意十足! 章晨曦(某保险公司技术经理) Oracle ACE-A,Oracle 10g O

利用Kettle进行SQLServer与Oracle之间的数据迁移实践

Kettle简介 Kettle(网地址为http://kettle.pentaho.org/)是一款国外开源的ETL工具,纯java编写,可以在Windows.Linux.Unix上运行,数据抽取高效稳定. Kettle 中文名称叫水壶,该项目的主程序员MATT 希望把各种数据放到一个壶里,然后以一种指定的格式流出.Kettle中有两种脚本文件,transformation和job,transformation完成针对数据的基础转换,job则完成整个工作流的控制. Windows环境下的安装与配

Entity Framework学习-实体框架中的code-first迁移

.net开发在涉及到操作数据库时,特别是访问SQL SERVER数据库时,经常需要使用一些ORM框架,最常用,且功能很强大的要数EF了.在使用EF进行涉及数据库的开发时,一般会涉及两种模式:1,DB first;2,Code first.相比前者,Code first比较灵活,适合敏捷开发,特别是数据库表结构经常变动的情况.在使用Code first时,经常会碰到对实体类的改动与数据库同步的问题,这时候我们就需要使用code first中的迁移功能,具体可以参考该文:https://msdn.m

CodeFirst迁移注意点

Context构造函数不检查__MigrationHistory 取消当数据库模型发生改变时删除当前数据库重建新数据库的设置.Database.SetInitializer<Context>(null);重新创建数据库Database.SetInitializer(new DropCreateDatabaseIfModelChanges<PortalContext>()); 重建数据库运行,生产环境此法严禁使用. 迁移方法1:AutomaticMigrationsEnabled=t

Oracle实践--PL/SQL基础之表分区

PL/SQL基础入门之表分区 PL/SQL:过程语言(Procedure  Language)和结构化语言(Structured Query Language)结合而成的编程语言,是对SQL的扩展,支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制语句,可创建存储过程,程序包和触发器等,给sql语句的执行添加程序逻辑,与Oracle服务器和Oracle工具紧密集成,具有可移植性,灵活性和安全性. ---------------------------------------------

NET5实践:项目创建-结构概述-程序运行-发布部署

ASP.NET5实践01:项目创建-结构概述-程序运行-发布部署 1.项目创建 ASP.NET5项目模板有三种: 新建项目: 选择模板: 2.结构概述 References对应配置是project.json中: "frameworks": { "dnx451": { }, "dnxcore50": { } }, ASP.NET5开发时支持多版本的clr共存,但运行时是使用其中一种. dnxcore50是跨平台.模块化的coreclr.它有多种,如

解决oracle11g数据库中空表exp无法导出的问题

之前再做项目的时候下载了一个开源的程序,数据库在移植的时候通过exp/imp导入导出,结果程序在启动时报错,对比过后发现两个数据库表相差了十几个,再排查问题,发现少掉的十几个表全部是空表,查了一下oracle11g的特性,发现当数据条数是0时不分配segment,所以就不能被导出!我勒个擦!坑爹有木有! 但是总不能每个表插入一条数据再导出吧,作为一个程序猿总不能上手工课吧,于是继续查,找到了一个解决办法,特此记录,以儆效尤! 第一种解决办法: 在创建数据库之前,先将数据库segment属性进行修