Entity Framework Core 2.0 使用代码进行自动迁移

一.前言

我们在使用EF进行开发的时候,肯定会遇到将迁移更新到生产数据库这个问题,前面写了一篇文章介绍了Entity Framework Core 2.0的入门使用,这里面介绍了使用命令生成迁移所需的SQL,然后更新到生产数据库的方法。这里还有另一种方法,就是利用EF Core自身所提供的方法来进行迁移。

二.API说明

这些方法都是DatabaseFacade的扩展方法,我们常使用的DbContext.Database就是DatabaseFacade类型。

  • GetMigrations 获取所有迁移

/// <summary>
/// Gets all the migrations that are defined in the configured migrations assembly.
/// </summary>
public static IEnumerable<string> GetMigrations([NotNull] this DatabaseFacade databaseFacade)
  • GetPendingMigrations 获取待迁移列表

/// <summary>
///     Gets all migrations that are defined in the assembly but haven't been applied to the target database.
/// </summary>
public static IEnumerable<string> GetPendingMigrations([NotNull] this DatabaseFacade databaseFacade)
  • GetAppliedMigrations 获取执行了迁移的列表

/// <summary>
///     Gets all migrations that have been applied to the target database.
/// </summary>
public static IEnumerable<string> GetAppliedMigrations([NotNull] this DatabaseFacade databaseFacade)
  • Migrate 执行迁移

/// <summary>
///     <para>
///         Applies any pending migrations for the context to the database. Will create the database
///         if it does not already exist.
///     </para>
///     <para>
///         Note that this API is mutually exclusive with DbContext.Database.EnsureCreated().
EnsureCreated does not use migrations
///         to create the database and therefore the database that is created cannot be later
updated using migrations.
///     </para>
/// </summary>
/// <param name="databaseFacade"> The
<see cref="T:Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade" /> for the context. </param>
public static void Migrate([NotNull] this DatabaseFacade databaseFacade)

三.实现自动迁移

我们可以利用上面的方法,让程序在启动的时候检查是否有待迁移,如果有那么执行迁移。这里以一个.NET Core 控制台应用程序作为示例:

1.定义一个检查迁移的方法
/// <summary>
/// 检查迁移
/// </summary>
/// <param name="db"></param>
static void CheckMigrations(BloggingContext db){Console.WriteLine("Check Migrations");    //判断是否有待迁移if (db.Database.GetPendingMigrations().Any()){Console.WriteLine("Migrating...");        //执行迁移db.Database.Migrate();Console.WriteLine("Migrated");}Console.WriteLine("Check Migrations Coomplete!"); }

2.在程序启动时调用

static void Main(string[] args){   
 using (var db = new BloggingContext()){        //检查迁移CheckMigrations(db);...} }

运行:

四.制作一个单独的迁移工具

上面的方法需要我们每次在应用程序启动的时候都去检查迁移,我们也可以单独制作一个控制台程序来进行迁移的更新,这样只要在更新迁移的时候放到服务器上执行一下就行 了。

我们在实际使用中,建议将EntityFrameWork Core单独作为一个项目

代码如下:

static void Main(string[] args){Console.WriteLine("Entity Framework Core Migrate Start !");Console.WriteLine("Get Pending Migrations...");   
     using (var db = new BloggingContext()){        //获取所有待迁移Console.WriteLine($"Pending Migrations:\n{string.Join('\n', db.Database.GetPendingMigrations().ToArray())}");Console.WriteLine("Do you want to continue?(Y/N)");      
  if (Console.ReadLine().Trim().ToLower() == "n"){            return;}Console.WriteLine("Migrating...");      
         try{            //执行迁移db.Database.Migrate();}        catch (Exception e){Console.WriteLine(e);          
              throw;}}Console.WriteLine("Entity Framework Core Migrate Complete !");Console.WriteLine("Press any key to exit !");Console.ReadKey(); }

执行效果:

本文Demo:https://github.com/stulzq/EntityFramework-Core-Migrator

.NET Core 交流群:4656606


原文地址:http://www.cnblogs.com/stulzq/p/7729380.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

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

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

相关文章

【JDBC】各版本jar包下载网址及Tomcat下载

http://central.maven.org/maven2/mysql/mysql-connector-java/ 自己的mysql的版本号会在登录之后显示 Tomcat链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bOMY_6hp7nV5KpU496YPlA 提取码&#xff1a;rerg

欢乐纪中某B组赛【2018.12.15】

前言 题目还好&#xff0c;都是装作很难&#xff0c;其实都不考高深算法。 某位A组dalao来水了个AK。 而且题号都很诡异 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC3332017myself2017myself2017myself22022022010010010010010010…

Mybatis中强大的功能元素:resultMap

转载自 Mybatis中强大的功能元素&#xff1a;resultMap 前言 在Mybatis中&#xff0c;有一个强大的功能元素resultMap。当我们希望将JDBC ResultSets中的数据&#xff0c;转化为合理的Java对象时&#xff0c;你就能感受到它的非凡之处。正如其官方所述的那样&#xff1a; re…

将编号为0和1的两个栈存放于一个数组空间V[m]中。

目录 1.题目描述 2.算法实现 1.题目描述 将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈顶指针top[0]等于-1时该栈为空&#xff1b;当第1号栈的栈顶指针top[1]等于m时该栈为空。两个栈均从两端向中间增长&#xff08;见图&#xff09;…

【JDBC】Eclipse连接Mysql

学习完servlet终于可以学习JDBC了&#xff0c;下载安装完mysql&#xff0c;导入jar包后&#xff0c;就可以利用java对mysql进行一系列的操作了 连接数据库并插入数据的代码 package com.k1998;import java.sql.Connection; import java.sql.Driver; import java.sql.DriverMa…

ASP.NET Core 2.0 依赖注入

问题 如何使用 ASP.NET Core 服务容器进行依赖注入&#xff1f; 答案 创建一个服务 public interface IGreetingService { string Greet(string to); } public class GreetingService : IGreetingService { public string Greet(string to){ return $"H…

CF741D-Arpa's letter-marked tree and Mehrdad's Dokhtar-kosh paths【树上启发式合并】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidCF741D 题目大意 一棵根为111的树&#xff0c;每条边上有一个字符(a−v(a-v(a−v共222222种)))。 一条简单路径被称为Dokhtar−koshDokhtar-koshDokhtar−kosh当且仅当路径上的字符经过重新排序后可以…

用数组存储字符C进行回文检测

#include<bits/stdc.h> using namespace std;int main() {char c[20];int i,j;cout<<"请输入字符c:";cin>>c;int nstrlen(c);for(i0,jn-1;i<j;i,j--){if(c[i]!c[j]) break;}if(i>j) cout<<"是回文&#xff01;";else cout&l…

面试 - 要不简单聊一下你对MySQL索引的理解?

转载自 面试 &#xff0d; 要不简单聊一下你对MySQL索引的理解&#xff1f; MySQL索引&#xff1f;这玩意儿还能简单聊&#xff1f;明显是在挖坑&#xff0c;幸好老夫早有准备&#xff0c;切听我一一道来。 一、索引是什么? 索引是帮助MySQL高效获取数据的数据结构。 二、…

ABP从入门到精通(4):使用基于JWT标准的Token访问WebApi

项目&#xff1a;asp.net zero 4.2.0 .net core&#xff08;1.1&#xff09; 版本 我们做项目的时候可能会遇到需要提供api给app调用&#xff0c;ABP动态生成的WebApi提供了方便的基于JWT标准的Token访问方式供我们访问API&#xff0c;不用在代码上做任何改动&#xff0c;很方便…

jzoj2700-数字【数论,LCM】

正题 luogu题目链接:https://www.luogu.org/problemnew/show/P4193 题目大意 定义一个函数D(x)D(x)D(x)和S(x)S(x)S(x)&#xff0c;S(x)S(x)S(x)表示xxx的各位之和 D(n){D(S(n)),S≥10S(n)D(n)\left\{\begin{matrix} \\D(S(n)),S\geq 10 \\S(n) \\ \\ \end{matrix}\right.D(n…

【Servlet】获取并输出服务器获得的数据

获取&#xff1a; String name req.getParameter(“username”); System.out.println(name); 输出 PrintWriter pw resp.getWriter(); pw.write(name); 学习serlvet的最佳学习地点https://www.bilibili.com/video/av68412637/?p136servlet知识点&#xff1a;servlet接口&…

回文是指正读反读均相同的字符序列;如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符序列是否是回文。(提示:将一半字符入栈)

文章目录 1.题目描述 2.算法实现 1.题目描述 回文是指正读反读均相同的字符序列&#xff1b;如“abba”和“abdba”均是回文&#xff0c;但“good”不是回文。试写一个算法判定给定的字符序列是否是回文。&#xff08;提示&#xff1a;将一半字符入栈&#xff09; 2.算法实现…

ASP.NET Core 2.0 + EF6 + Linux +MySql混搭

好消息&#xff01;特好消息&#xff01;同时使用ASP.NET Core 2.0和.NET Framework类库还能运行在linux上的方法来啦&#xff01; 是的&#xff0c;你没有看错&#xff01;ASP.NET Core 2.0&#xff0c;.NET Framework类库&#xff0c;linux通通都给你&#xff0c;不要998只要…

面试被问Mysql没答上来?阿里P5:总结了55道常见面试题,收藏一波

转载自 面试被问Mysql没答上来&#xff1f;阿里P5:总结了55道常见面试题&#xff0c;收藏一波 正文开始前&#xff0c;分享阿里 P8 高级架构师吐血总结的 《Java 核心知识体系&面试资料.pdf》, 非卖课程的哟&#xff01; 阿里 P8 级高级架构师吐血总结的一份 Java 核心知…

jzoj3511-cza的蛋糕【状态压缩dp,dfs】

正题 题目大意 n∗mn*mn∗m的矩阵&#xff0c;有些阻挡&#xff0c;求至少要多少个1∗21*21∗2或2∗12*12∗1的块铺在上面使得没用可以继续铺的地方。 解题思路 因为mmm很小&#xff0c;明显状压。 用fi,j,kf_{i,j,k}fi,j,k​表示第iii行&#xff0c;上一行状态为jjj&#xff…

【C单链表】链表与尾插法

struct struct的几种用法。 1、基本结构体定义 struct stu {int score;int id;char name[20]; };2、进阶结构体定义 struct stu {int score;int id;char name[20]; }st1;下面多了个st1&#xff0c;其实就相当于 struct stu {int score;int id;char name[20]; }; struct stu…

请设计一个栈,实现十进制数转任意进制数。

文章目录 1.题目描述 2.代码实现 1.题目描述 请设计一个栈&#xff0c;实现十进制数转任意进制数 2.代码实现 #include <iostream> using namespace std;#define MAXSIZE 100typedef struct {int *base;//栈底指针int *top;//栈顶指针int stacksize;//栈最大容量 } S…

开源纯C#工控网关+组态软件(四)上下位机通讯原理

一、 网关的功能&#xff1a;承上启下 最近有点忙&#xff0c;更新慢了。感谢园友们给予的支持&#xff0c;现在github上已经有。目标是最好的开源组态&#xff0c;看来又近一步^^ 之前有提到网关是物联网的关键环节&#xff0c;它的作用就是承上启下。 下位机有下位机的语言…

【Java】继承与多态

1、继承 由于一个对象功能的单一性&#xff0c;我们想对其进行扩展&#xff0c;但想保留其属性和功能&#xff0c;我们就必须用到继承。 java继承的特性&#xff1a; 单继承&#xff1a;java里的对象不同于C&#xff0c;只能进行单继承&#xff0c;即一个对象只能有一个父亲 …