前言
當透過 ABP CLI 建立專案後,會透過執行方案中的 DbMigrator 來建立資料庫及資料表。
那執行 DbMigrator.EXE 會做那些事呢?
研究
DbMigrator.EXE 會執行 Domain 專案中的 DbMigrationService.MigrateAsync,
它會做以下幾件事,
1.呼叫 AddInitialMigrationIfNotExist 檢查初始的 DB Migration 是否有建立出來
1.1.判斷是否有 EntityFrameworkCoreProject 目錄
1.2.如果 EntityFrameworkCoreProject 目錄存在,判斷是否有 Migrations 子目錄,如果沒有,就執行 abp create-migration-and-run-migrator 建立初始的 Migration(通常不會發生,因為方案一建立好後,會一併建立初始 Migration)
2.如果有執行建立初始 Migration(AddInitialMigrationIfNotExist()回傳值為true),就離開 MigrateAsync Method
3.執行 host(Tenant 為 null) 的 DB Migration(MigrateDatabaseSchemaAsync),相當於執行 EF 的 database update(dotnet ef database update)
4.建立 host(Tenant 為 null) 的 Seed Data(SeedDataAsync),會掃方案中有實作IDataSeedContributor類別,然後執行它的SeedAsync
在 DomainModule 的 ConfigureService 加入設定 AbpDataSeedOptions 程式碼,
可以從 options.Contributors 查看有多少的 DataSeedContributor 要執行,
1 | Configure<AbpDataSeedOptions>(options => |
5.檢查是否有其他的 Tenant ,並設定跑在別的 DB 上面,有就重覆執行 DB Migration 及 Seed Data
Q.可以讓系統自動執行 DbMigrationService.MigrateAsync 嗎?
可以在Program.cs中的await app.InitializeApplicationAsync();後,await app.RunAsync();前,
加入執行 DbMigrationService.MigrateAsync 就可以了。
1 | public async static Task<int> Main(string[] args) |
參考資源
ABP 系統建立的 DataSeedContributor 會跑 2 次 SeedAsync,導致發生 DB duplicate key 的錯誤?
EF 在執行階段套用移轉
一行服一行,煙膏怕紅糖 : 萬物相克,一物克一物。