开发过程中都会遇到数据库数据结构更新的问题,怎么对数据库更新进行版本控制呢?
不同的项目对数据库版本更新控制的方式不同,常用的有第三方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文件夹下新增增量变更文件,运行项目即可更新数据库,对线上数据库更新也很方便。好久没写了,新的一年也在博客园打下卡,其次是键盘进水了,写这篇博客想测试下新键盘是否好用。^_^ ^_^