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

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. ReactNative: 使用标签栏组件TabBarIOS组件

    一.简介 标签栏Tab的作用对于应用程序那是不言而喻的,它是应用程序中除了导航栏组件外的又一个核心组件,使用它可以实现页面的切换.RN提供了一个TabBarIOS组件来完成页面的切换(视图或者路由), ...

  2. 【第二章】Zabbix3.4监控SQLServer数据库和H3C交换机思科Cisco防火墙交换机教程笔记

    监控SQLServer数据库 SSMS执行相关SQL SQL模板命名规则 Zabbix客户端导入模板 添加SQLServer监控图形 SQLServer服务器关联模板 监控思科Cisco防火墙交换机 ...

  3. Metasploit从文件中读取目标地址

    本文简单介绍如何使用Metasploit从文件中读取目标地址,来执行检测. 以检测MS17-010漏洞为例,在设定RHOSTS参数时,可设定目标地址范围和CIDR地址块,设定单个IP的目标也是可以的. ...

  4. Charles 使用笔记

     一.介绍 Charles 属于抓包软件. Charles 多平台支持,mac.windows.linux. Charles 是收费软件,可以免费试用 30 天.试用期过后,未付费的用户仍然可以继续使 ...

  5. 动态数组原理【Java实现】(六)

    前言 接下来我们进入集合学习,看过很多文章一上来就是讲解原理感觉会特别枯燥,任何成熟解决方案的出现都是为了解决问题,若通过实际问题引入然后再来讲解原理想必学起来必定事半功倍,从我写博客的那一天起,我就 ...

  6. 自学_DOM<五>

    类库DOM DOM(document object medol)文档对象模型. DOM就是HTML页面的模型,将每个标签都做为一个对象,JavaScript通过调用DOM中的属性.方法就可以对网页中的 ...

  7. .Net Core权限认证基于Cookie的认证&授权.Scheme、Policy扩展

    在身份认证中,如果某个Action需要权限才能访问,最开始的想法就是,哪个Action需要权限才能访问,我们写个特性标注到上面即可,[TypeFilter(typeof(CustomAuthorize ...

  8. JS基础语法---Date对象中常见的方法

    创建实例对象 var dt = new Date(); //当前的时间---当前的服务器 console.log(dt); var dt = new Date("2017-08-12&quo ...

  9. 在vue组件中设置定时器和清除定时器

    由于项目中难免会碰到需要实时刷新,无论是获取短信码,还是在支付完成后轮询获取当前最新支付状态,这时就需要用到定时器.但是,定时器如果不及时合理地清除,会造成业务逻辑混乱甚至应用卡死的情况,这个时就需要 ...

  10. Vue组件通信的几种方法

    上一节说到,vue.js是允许子组件通过props接受父组件的信息,但是不允许父组件通过props接受子组件的信息 1. $emit()和on 当子组件需要向父组件传递数据时,就要用到自定义事件. 使 ...