作为程序员,在日常开发中,记忆犹新的莫过于写代码,升级程序。升级程序包含两部分:一是,对服务程序更新;二是,对数据库结构更新。本篇博文主要介绍数据库结构更新,在对数据库升级时,不知道园友们是否有如下经历:

1)脚本文件中建表语句未作判断是否存在,而导致执行失败。

2)脚本文件中修改字段在建表语句之前,关联存储过程执行顺序颠倒而导致执行失败。

3)各个历史脚本文件代码重复又重复,如存储过程代码在多个脚本文件中存在。

4)新客户往往要执行多个脚本文件,才能使用最新的产品。

可以说,数据库升级是否能成功,成了众多程序员特别是团队管理者的心病了。接下来,详细介绍使用EF Core实现数据库升级。

一.使用EF Core命令方式进行迁移数据库

1. 程序包管理器控制台(PMC)迁移数据库

1)准备好实体(对应数据库表),数据库操作类,数据库连接字符串,及数据库操作服务。

a.学生实体类

public class Student
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}

b.数据库操作类

public class SchoolDB:DbContext
{
public SchoolDB(DbContextOptions<SchoolDB> options) : base(options)
{ } public DbSet<Student> Students { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) {
modelBuilder.Entity<Student>().ToTable(nameof(Student));
}
}

c.在appsettings.json中配置数据库连接字符串

{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"SchoolDB": "Server=ERQFJF;Database=SchoolDB;User ID=sa;Password=******"
}
}

d.在Startup中注入数据库操作服务

public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddDbContext<SchoolDB>((options) => { options.UseSqlServer(Configuration.GetConnectionString("SchoolDB")); });
}

e.如下图:是整个代码初始架构及数据库情况,方便后续操作过程进行比较

2)打开PMC,如下图

3)接下来可以在PMC中输入相关命令来创建迭代版本,升级数据库。

a.使用Add-Migration命令创建迭代版本:如下图

b.使用Update-Database升级数据库:如下图

升级数据库命令Update-Database

升级后结果

4)当实体模型有更新时(如新增实体,新增实体属性,修改实体属性等),重复2(使用Add-Migration创建迭代文件),3(使用Update-Database更新数据库)步骤,实现数据 库(表)与程序(实体)同步,达成数据库升级。

2.迭代文件说明,如下图

3.缺陷说明:

PMC只能在Visual Studio下运行,在生产环境下无法使用,即无法在生产环境下使用PMC升级数据库。

或许有园友会说,可以把其导出脚本放到数据库中执行,这种方式只适合于首次使用产品的用户,对于已经使用产品的用户,则会存在以下问题:

1)导出的脚本不能直接使用,如创建表,新增字段等没有做任何判断,需要修改相关脚本。

2)若有很多客户,每个客户的升级的版本都不一致,要逐个客户导出适用的脚本,工作量巨大

3)有些客户的数据库服务器管理很严,外部人员不能直连数据库操作

二.自动升级数据库

1.前面2个步骤,与PMC一致

准备好实体(对应数据库表),数据库操作类,数据库连接字符串,及数据库操作服务。

通过Add-Migration命令创建迭代文件

2.通过DatabaseFacade.Migrate方法进行自动升级数据库,代码如下图

三.总结

1.通篇介绍下来,基本上是关于数据库升级。那什么是数据库迁移:其实就是数据库升级,数据库架构更新。

2.使用命令方式升级数据库,除了PMC,还有CLI,其操作步骤相似,只是命令不一样。下表列出了两种方式的命令:

3.使用DatabaseFacade.Migrate()实现自动升级数据库。

谈谈EF Core实现数据库迁移的更多相关文章

  1. .Net Core建站(2):EF Core+CodeFirst数据库迁移

    上一篇的话,说了下怎么使用EF7 实现 CodeFirst去生成数据库, 其实还有好多问题的,这次一点一点的解决吧,都挺简单,不过零零散散的,, 1.读取配置文件,获得链接字符串 2.使用数据库进行增 ...

  2. EntityFramework Core 2.x (ef core) 在迁移中自动生成数据库表和列说明

    在项目开发中有没有用过拼音首字母做列名或者接手这样的项目? 看见xmspsqb(项目审批申请表)这种表名时是否有一种无法抑制的想肛了取名的老兄的冲动? 更坑爹的是这种数据库没有文档(或者文档老旧不堪早 ...

  3. Entity Framework Core 之数据库迁移

    前言 最近打算用.NET Core写一份开源的简易CMS系统,来练练手 所以又去深入研究了一下Entity Framework Core 发现其实有些细节园子里还是很少讲到. 特意整理了几个细节. 正 ...

  4. EF Core CodeFirst数据库自动迁移

    开发过程中都会遇到数据库数据结构更新的问题,怎么对数据库更新进行版本控制呢? 不同的项目对数据库版本更新控制的方式不同,常用的有第三方Evolve,开发人员将数据库更新脚本按照版本号的放在一起,然后执 ...

  5. AspNet Core :创建自定义 EF Core 链接数据库

    这两天比较忙,写的会慢一点. 我们以控制台演示 EF Core的链接数据库 首先创建控制台程序 创建数据上下文类 EntityTable /// <summary> /// 继承 DbCo ...

  6. ASP.NET CORE系列【六】Entity Framework Core 之数据库迁移

    前言 最近打算用.NET Core写一份简单的后台系统,来练练手 然后又用到了Entity Framework Core 发现园子里有些文章讲得不是那么细节,对于新手小白来说,可能会有点懵. 特意整理 ...

  7. EF Core Model更新迁移

    EF Core 迁移 感觉就是以前EF Code First的自动同步数据库功能 内容:在你新增.更新TableModel后,如何自动化的更新DB中的真实Table.以及对这些更改进行一个版本控制. ...

  8. EF Core的安装、EF Core与数据库结合

    一.新建一个.net core的MVC项目                         新建好项目后,不能像以前一样直接在新建项中添加ef, 需要用命令在添加ef的依赖      二.EF Cor ...

  9. ASP.NET CORE 使用 EF CORE访问数据库

    asp.net core通过ef core来访问数据库,这里用的是代码优先,通过迁移来同步数据库与模型. 环境:vs2017,win10,asp.net core 2.1 一.从建立asp.net c ...

随机推荐

  1. 常用类-CSV---OLEDB

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  2. JAVA笔记 -- 访问权限控制

    访问权限控制 没有权限控制的时候,由于所有的接口都是可以访问的.当一个类库部分代码,发现有更好的方法解决的时候,可能其他接口会发生改动.这会导致另一个地方的引用该类库的程序发生崩溃.为了解决这种问题, ...

  3. 设计好的报表是如何在 web 上显示的

    润乾报表主要用来开发在 java web 端呈现的报表工具,设计器为桌面版,那么开发后的报表如何发布到 web 端是用户较为关心的问题. 润乾报表 web 端发布,采用 Taglib 方式,只需要在 ...

  4. 简单快速上手Jackson使用

    1简介 Jackson具有比较高的序列化和反序列化效率,据测试,无论是哪种形式的转换,Jackson > Gson > Json-lib,而且Jackson的处理能力甚至高出Json-li ...

  5. kmeans均值聚类算法实现

    这个算法中文名为k均值聚类算法,首先我们在二维的特殊条件下讨论其实现的过程,方便大家理解. 第一步.随机生成质心 由于这是一个无监督学习的算法,因此我们首先在一个二维的坐标轴下随机给定一堆点,并随即给 ...

  6. QT无窗口状态下对键盘事件的监听

    Question:最近在搞linux下的一个客户端项目,需要接收键盘事件,但是又不能有界面,这种情况怎么处理呢? int main(int argc, char *argv[]) { QApplica ...

  7. MD5是个好东西 / MD5 is a nice guy

    md5是一种摘要生成算法,通过对消息生成唯一摘要,可校验消息是否被篡改. 众所周知,md5广泛用在http接口通讯的安全控制上,通过在签名原始串后加上商户通信秘钥,进行MD5运算,形成的摘要字符串即为 ...

  8. mago3DJS 应用

    用于3D多块可视化的开源JavaScript库 生成3D GIS平台,集成和可视化AEC(建筑,工程,建筑)区域和传统的3D空间信息(3D GIS).将AEC和3D GIS集成到Web浏览器中,室内, ...

  9. Successive Convex Approximation (SCA)

    Successive Convex Approximation (SCA) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ Successive Con ...

  10. java8 的files、path类相关文件遍历API

    Path的两种初始化(应该还有别的方式) Path file = new File(path).toPath(); Paths.get 判断是文件.是目录 Files.isRegularFile(fi ...