前言
當透過 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 在執行階段套用移轉
一行服一行,煙膏怕紅糖 : 萬物相克,一物克一物。