• EF Core CodeFirst数据库自动迁移


     开发过程中都会遇到数据库数据结构更新的问题,怎么对数据库更新进行版本控制呢?

    不同的项目对数据库版本更新控制的方式不同,常用的有第三方Evolve,开发人员将数据库更新脚本按照版本号的放在一起,然后执行命令进行数据库更新。在之前EF的博客中也有介绍到数据库迁移的内容,一般在本地开发时只需要执行Add-Migration [Name]和Update-Database [Name]就能实现对本地数据库的更新。昨天突然想到一个问题,如果项目发布到线上了,而线上的数据库开发人员在本地又不能直接连接,还没办法直接使用上面的两个命令完成数据库的更新。于是百度了好久,网上也有好几种解决方案。这里我使用自动更新的方式。主要方法为:EF core code first字段更新后执行Add-Migration [Name],然后执行MigrateAsync()方法即可完成。

    一、更新实体Model

    在UserEntity中新增一个TestId字段用来测试。

            [Display(Name = "TestId")]
            public int TestId { get; set; }

    二、在程序包管理器控制台输入命令Add-Migration [Name]

    Add-Migration userTestId

    三、创建DbInitializer.cs

    如果在本地开发环境,可以直接执行Update-Database userTestId命令实现本地数据库的更新,但这里为了演示自动更新,需要创建DbInitializer.cs类。

        public class DbInitializer
        {
            public async Task InitializeAsync(RentContext context)
            {
                //var migrations = await context.Database.GetPendingMigrationsAsync();//获取未应用的Migrations,不必要,MigrateAsync方法会自动处理
                await context.Database.MigrateAsync();//根据Migrations修改/创建数据库
            }
        }

    四、Startup.cs中调用上面DbInitializer的更新方法

    1.首先注入数据库上下文

            public void ConfigureContainer(ContainerBuilder builder)
            {
                builder.RegisterType<RentContext>();
                builder.RegisterModule<ConfigureAutofac>(); 
            }

    2.然后在Configure方法添加数据库上下文参数RentContext context

     public void Configure(IApplicationBuilder app, IWebHostEnvironment env, RentContext context)

    3.在Configure方法执行下面的语句进行数据库更新

    new DbInitializer().InitializeAsync(context).Wait();

    五、启动项目运行即可看到数据库中新增的测试字段TestId

    此处并未执行Update-Database userTestId命令,运行项目依然可以看到TestId字段。

     六、总结

    使用自动更新只需要在实体model有更新时执行Add-Migration 命令,在Migrations文件夹下新增增量变更文件,运行项目即可更新数据库,对线上数据库更新也很方便。好久没写了,新的一年也在博客园打下卡,其次是键盘进水了,写这篇博客想测试下新键盘是否好用。^_^ ^_^

  • 相关阅读:
    【转】Unity中的协同程序-使用Promise进行封装(二)
    结合索引优化SQL语句提高数据库查询效率
    结合索引优化SQL语句提高数据库查询效率
    数据库SQL优化大总结之百万级数据库优化方案
    Oracle回收站功能,彻底删除表(purge recyclebin)
    Oracle回收站功能,彻底删除表(purge recyclebin)
    分布式环境中三种Session管理方法的使用场景及优缺点
    分布式环境中三种Session管理方法的使用场景及优缺点
    [转载]“对不起,我家里不同意”多少爱情败给了它?
    [转载]“对不起,我家里不同意”多少爱情败给了它?
  • 原文地址:https://www.cnblogs.com/5ishare/p/14248815.html
Copyright © 2020-2023  润新知