Entity Framework Core 代码自动化迁移

news2024/9/27 12:13:18

简述

  • 文章内容基于:.NET6 Entity Framewor kCore 7.0.*

使用 EF Core 进行 Code First 开发的时候,肯定会遇到将迁移更新到生产数据库这个问题,大多数都是使用命令生成迁移 SQL,然后使用 SQL 脚本将更新迁移到生产数据库的方式,这也是官方推荐做法,毕竟专人专事嘛。
当时凡是都有例外,EF Core 自身提供了迁移API。

API Summary

API 均 DatabaseFacade 扩展方法,基类对象 DbContext.Database 就是 DatabaseFacade 类型。这里只简述同步方法,异步方法同理。

  • GetMigrations 获取所有迁移
/// <summary>
///     Gets all the migrations that are defined in the configured migrations assembly.
/// </summary>
/// <remarks>
///     See <see href="https://aka.ms/efcore-docs-migrations">Database migrations</see> for more information and examples.
/// </remarks>
/// <param name="databaseFacade">The <see cref="DatabaseFacade" /> for the context.</param>
/// <returns>The list of migrations.</returns>
public static IEnumerable<string> GetMigrations(this DatabaseFacade databaseFacade)
    => databaseFacade.GetRelationalService<IMigrationsAssembly>().Migrations.Keys;
  • GetPendingMigrations 获取待迁移列表
/// <summary>
///     Gets all migrations that are defined in the assembly but haven't been applied to the target database.
/// </summary>
/// <remarks>
///     See <see href="https://aka.ms/efcore-docs-migrations">Database migrations</see> for more information and examples.
/// </remarks>
/// <param name="databaseFacade">The <see cref="DatabaseFacade" /> for the context.</param>
/// <returns>The list of migrations.</returns>
public static IEnumerable<string> GetPendingMigrations(this DatabaseFacade databaseFacade)
    => GetMigrations(databaseFacade).Except(GetAppliedMigrations(databaseFacade));
  • GetAppliedMigrations 获取执行了迁移的列表
/// <summary>
///     Gets all migrations that have been applied to the target database.
/// </summary>
/// <remarks>
///     See <see href="https://aka.ms/efcore-docs-migrations">Database migrations</see> for more information and examples.
/// </remarks>
/// <param name="databaseFacade">The <see cref="DatabaseFacade" /> for the context.</param>
/// <returns>The list of migrations.</returns>
public static IEnumerable<string> GetAppliedMigrations(this DatabaseFacade databaseFacade)
    => databaseFacade.GetRelationalService<IHistoryRepository>()
        .GetAppliedMigrations().Select(hr => hr.MigrationId);
  • Migrate 执行迁移
/// <summary>
///     Applies any pending migrations for the context to the database. Will create the database
///     if it does not already exist.
/// </summary>
/// <remarks>
///     <para>
///         Note that this API is mutually exclusive with <see cref="DatabaseFacade.EnsureCreated" />. EnsureCreated does not use 
migrations
///         to create the database and therefore the database that is created cannot be later updated using migrations.
///     </para>
///     <para>
///         See <see href="https://aka.ms/efcore-docs-migrations">Database migrations</see> for more information and examples.
///     </para>
/// </remarks>
/// <param name="databaseFacade">The <see cref="DatabaseFacade" /> for the context.</param>
public static void Migrate(this DatabaseFacade databaseFacade)
    => databaseFacade.GetRelationalService<IMigrator>().Migrate();

迁移思路

  1. 使用 cli 命令 Add-Migration migrationName 生成迁移文件;
  2. 迁移查询API查询待迁移文件;
  3. 调用迁移API执行迁移;

为什么要执行 cli 来生成迁移文件而不是连同迁移文件的生成也做成自动的呢?

主要原因是,一般数据库结果发生变动都是在开发阶段,此时使用 cli 更加的方便也更不容易出现因为代码逻辑而造成的 bug,从而降低开发成本。并且生成的迁移文件在生产环境下执行也是可以保证数据库更新可以依赖版本内容变动而变动的。

using Microsoft.EntityFrameworkCore;
using YJCA.Blog.EntityFrameWorkCore.EntityFrameworkCore;

Console.WriteLine("Entity Framework Core Migrate Start !\nGet Pending Migrations...");

using (BlogDbContext dbContextFactory = new BlogDbContext())
{
    var dbContext = dbContextFactory.Database;
    // 是否存在待迁移
    if (!dbContext.GetPendingMigrations().Any())
        Console.WriteLine("No to be migrated");
    else
    {
        Console.WriteLine($"Pending Migrations:\n{string.Join("\n", await dbContext.GetPendingMigrationsAsync())}");

        Console.WriteLine("Do you want to continue?(Y/N)");

        if (Console.ReadLine().Trim().Equals("y", StringComparison.OrdinalIgnoreCase))
        {
            Console.WriteLine("Migrating...");
            try
            {
                await dbContext.MigrateAsync();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                throw;
            }
        }
    }
}

Console.WriteLine("Entity Framework Core Migrate Complete !\nPress any key to exit !");

Console.ReadKey();

运行:
效果图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/131081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【一起从0开始学习人工智能0x03】文本特征抽取TfidVectorizer

文章目录文本特征抽取TfidVectorizerTfidVecorizer--------Tf-IDFTF-IDF------重要程度文本特征抽取TfidVectorizer 前几种方法的缺点&#xff1a;有很多词虽然没意义&#xff0c;但是出现次数很多&#xff0c;会影响结果&#xff0c;有失偏颇------------关键词 TfidVecoriz…

一篇文章带你搞懂nodeJs环境配置

1、nodeJs下载地址&#xff0c;这里可以选择你想要的版本&#xff0c;我这里以14.15.1为例 2、下载完成后&#xff0c;直接傻瓜式安装即可。 3、打开命令行&#xff08;以管理员身份打开&#xff09;,输入node -v&#xff0c;出现以下版本号&#xff0c;代表node成功安装 4、在…

html+css设计两个摆动的大灯笼

实现效果 新年马上就要到了&#xff0c;教大家用htmlcss设计两个大灯笼&#xff0c;喜气洋洋。 html代码&#xff1a; html代码部分非常简单&#xff0c;将一个灯笼分成几部分进行设计&#xff0c;灯笼最上方部分&#xff0c;中间的线条部分和最下方的灯笼穗。组合在一起就…

docker系列教程:docker图形化工具安装及docker系列教程总结

通过前面的学习,我们已经掌握了docker-compose容器编排及实战了。高级篇也算快完了。有没有相关,我们前面学习的时候,都是通过命令行来操作docker的,难道docker就没有图形化工具吗?答案是肯定有的。咱们本篇就来讲讲docker图形化工具及使用图形化工具安装Nginx及docker系列…

读书系列2022(下)读书纪录片

目录 一、认知类 二、纪录片 一、认知类 《蓝海战略》&#xff1a; 让你(企业/个人)在竞争中产生错位竞争&#xff0c;获得优势 《认知盈余》&#xff1a;“人们实际上很喜欢创造并分享”&#xff0c; 参与是一种行为 将人们的自由时间和特殊才能汇聚在一起&#xff0c;共同…

移动Web【字体图标、平面转换[位移,旋转,转换原点,多重转换]、渐变】

文章目录一、字体图标1.1 图标库1.2 下载字体包&#xff1a;1.3 使用字体图标&#xff1a;1.4 使用字体图标 – 类名&#xff1a;1.5 案例&#xff1a;淘宝购物车1.6 上传矢量图&#xff1a;二、平面转换2.1 位移2.1 位移-绝对定位居中2.3 案例2.4 旋转2.5 转换原点2.6 多重转换…

2022年终总结:不一样的形式,不一样的展现

Author&#xff1a;AXYZdong 硕士在读 工科男 有一点思考&#xff0c;有一点想法&#xff0c;有一点理性&#xff01; 定个小小目标&#xff0c;努力成为习惯&#xff01;在最美的年华遇见更好的自己&#xff01; CSDNAXYZdong&#xff0c;CSDN首发&#xff0c;AXYZdong原创 唯…

你真的了解表达式求值吗?

表达式求值大家很熟悉特别是整型十进制的表达式求值。那么char类型的表达式求值是怎么样的&#xff1f;Eg&#xff1a;#include <stdio.h>int main() {char a 127;char b 3;char c a b;printf("%d %d %d\n",a,b,c);return 0; }上面程序输出的结果是多少&am…

2022跟学尚硅谷Maven入门(一)纯命令行

2022跟学尚硅谷Maven入门 一 纯命令行Maven从小白到专家应用场景开发过程自动部署私有仓库课程介绍小白目标普通开发人员目标资深开发人员目标第一章:Maven 概述第一节 为什么要学习MavenMaven 作为依赖管理工具(1)jar包的规模(2)jar 包的来源(3)jar包之间的依赖关系Maven 作为…

APSIM练习:播种作物练—高粱作物模拟

在本练习中&#xff0c;您将观察作物在一个季节内的生长情况。您将更多地了解如何使用 APSIM 对施肥率进行“假设”实验。这些技能不仅可以用来试验施肥率&#xff0c;还可以用来试验变量&#xff0c;例如&#xff1a; 种植时间。播种率。作物比较和不同的起始土壤水分条件。 …

C++之异常

文章目录一、C 语言传统的处理错误的方式二、C 异常概念三、异常的使用1.异常的抛出和捕获2.异常的重新抛出3.异常安全4.异常规范四、自定义异常体系五、C 标准库的异常体系六、异常的优缺点一、C 语言传统的处理错误的方式 传统的错误处理机制&#xff1a;   ① 终止程序&a…

JUC(十)-线程池-ThreadPoolExecutor分析

ThreadPoolExecutor 应用 & 源码解析 文章目录ThreadPoolExecutor 应用 & 源码解析一、线程池相关介绍1.1 为什么有了JDK提供的现有的创建线程池的方法(Executors类中的方法),然而还需要自定义线程池ThreadPoolExecutor 提供的七个核心参数大致了解JDK提供的几种拒绝策…

一辆适合长途出行的电动跑车 奥迪RS e-tron GT正式上市

作为奥迪品牌电动化发展的先锋力作&#xff0c;奥迪RS e-tron GT不止是前瞻科技的呈现&#xff0c;在e-tron纯电技术的加持下&#xff0c;更传递着RS的情怀&#xff0c;承载着人们对GT豪华休旅生活的向往。 2022年12月30日&#xff0c;伴随着Audi Channel第九期直播节目盛大开播…

MySQL存储引擎介绍以及InnoDB引擎结构理解

目录存储引擎概述各个存储引擎介绍InnoDBMySIAMMemeory其他引擎引擎有关的SQL语句InnoDB引擎逻辑存储结构架构内存部分磁盘部分后台线程InnoDB三大特性存储引擎概述 数据引擎是与数据真正存储的磁盘文件打交道的&#xff0c;它的上层&#xff08;服务层&#xff09;将处理好的…

我的Python学习笔记:私有变量

一、私有变量的定义 在Python中&#xff0c;有以下几种方式来定义变量&#xff1a; xx&#xff1a;公有变量_xx&#xff1a;单前置下划线&#xff0c;私有化属性或方法&#xff0c;类对象和子类可以访问&#xff0c;from somemodule import *禁止导入__xx&#xff1a;双前置下…

掌握Python中列表生成式的五个原因

1. 引言 在Python中我们往往使用列表生成式来代替for循环&#xff0c;本文通过引入实际例子&#xff0c;来阐述这背后的原因。 闲话少说&#xff0c;我们直接开始吧&#xff01; 2. 简洁性 列表生成式允许我们在一行代码中创建一个列表并对其元素执行相应的操作&#xff0…

(十五)大白话我们每一行的实际数据在磁盘上是如何存储的?

文章目录 1、前情回顾2、真实数据是如何存储的?3、隐藏字段4、初步的把磁盘上的数据和内存里的数据给关联起来1、前情回顾 之前我们已经给大家讲过了,一行数据在磁盘文件里存储的时候,包括如下几部分: 首先会包含自己的变长字段的长度列表然后是NULL值列表接着是数据头然后…

图的概念及存储结构

文章目录图的概念图(graph)有向图(directed graph)无向图(undirected graph)加权图(weighted graph)无向完全图(undirected complete graph)有向完全图(directed complete graph)子图(subgraph)稀疏图与稠密图度路径与回路连通图与连通分量强连通图与强连通分量生成树图的存储结…

STM32H750自制开发板调试经验

​本篇只是一个记录&#xff0c;没啥可看的。 STM32H750硬件相关 STM32H750可以通过USB-OTG下载程序&#xff0c;也可以使用SWD进行调试&#xff0c;所以设计板子得时候将PA13和PA12预留出来即可&#xff0c;后续也可以用作usb虚拟串口&#xff08;CDC&#xff09;功能或者模拟…

stm32f407VET6 系统学习 day08 利用adc 模数转换 监控光敏电阻。

1. ADC 的知识 1.基本概念 &#xff1a; Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件 。典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。 2.STM32F4x ADC特点 1. 可配…