1. 程式人生 > 資料庫 >EF Core CodeFirst資料庫自動遷移

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資料夾下新增增量變更檔案,執行專案即可更新資料庫,對線上資料庫更新也很方便。好久沒寫了,新的一年也在部落格園打下卡,其次是鍵盤進水了,寫這篇部落格想測試下新鍵盤是否好用。^_^ ^_^