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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

Idea SpringMVC+Spring+MyBatis+Maven整合

http://blog.csdn.net/u011403655/article/details/46843331

1012
来自专栏微信公众号:Java团长

Spring Boot入门

Spring Boot是Spring社区较新的一个项目。该项目的目的是帮助开发者更容易的创建基于Spring的应用程序和服务,让更多人的人更快的对Spring进...

781
来自专栏java工会

Spring Boot入门

1462
来自专栏iOSDevLog

How do you compare two version Strings in Java?

https://stackoverflow.com/questions/198431/how-do-you-compare-two-version-string...

914
来自专栏Web项目聚集地

从零学习Spring Boot-入门起步

Spring Boot是Spring社区较新的一个项目。该项目的目的是帮助开发者更容易的创建基于Spring的应用程序和服务,让更多人的人更快的对Spring进...

653
来自专栏后端之路

SpringBoot 打包之可运行jar

背景 一个可运行的工具始终比XXX配置更加方便 每次一堆tomcat版本指定,对应jar替换 各种打包 替换properties 参考 maven profil...

34410
来自专栏向治洪

spring Boot 配置文件详解

概要        前面我们讲述了如何搭建一个简单的 spring Boot 应用(参见Spring Boot - 初探),这里,我们来学习如何对项目进行相关的...

2535
来自专栏吴伟祥

Spring Test 整合 JUnit 4 使用总结

AbstractJUnit4SpringContextTests 或 AbstractTransactionalJUnit4SpringContextTest...

663
来自专栏yukong的小专栏

【SpringBoot2.0系列05】SpringBoot之整合Mybatis前言实现

【SpringBoot2.0系列02】SpringBoot之使用Thymeleaf视图模板

992
来自专栏pangguoming

Spring Boot Maven Plugin打包异常及三种解决方法:Unable to find main class

1582

扫码关注云+社区