EF Core 5 有各種事件,但它們與DbContext. 沒有與遷移相關的事件 ( Migration)。
我想在應用所有遷移后運行自定義代碼 - 無論是由代碼 ( context.Database.Migrate()) 還是由 CLI ( dotnet ef database update)觸發。
解決方法是添加一個“空”遷移,并將我的代碼放在它的Up方法中。但是每次添加遷移時我都需要這樣做。
假設沒有我可以使用的事件或掛鉤(是否存在?),在應用所有遷移后如何運行自定義代碼?
uj5u.com熱心網友回復:
這是一個解決方法。
[DbContext(typeof(MyContext))]
[Migration("99999999999999_Last1")]
public class Last1 : Migration {
protected override void Up(MigrationBuilder migrationBuilder) {
Task.Run(() => callPostMigrationCodeThatIsIdempotent()).GetAwaiter().GetResult();
migrationBuilder.DeleteData(HistoryRepository.DefaultTableName, nameof(HistoryRow.MigrationId), "string", "99999999999999_Last2", null);
}
}
[DbContext(typeof(MyContext))]
[Migration("99999999999999_Last2")]
public class Last2 : Migration {
protected override void Up(MigrationBuilder migrationBuilder) {
Task.Run(() => callPostMigrationCodeThatIsIdempotent()).GetAwaiter().GetResult();
migrationBuilder.DeleteData(HistoryRepository.DefaultTableName, nameof(HistoryRow.MigrationId), "string", "99999999999999_Last1", null);
}
}
有兩個“最后”遷移:
- 選擇它們的 ID,以便它們最后運行(“99999999999999”)
- 兩者都呼叫自定義代碼,該代碼必須是冪等的
- 每個從歷史表中洗掉另一個
- 它們
Task.Run用于異步過同步
在每次運行期間,一個或另一個運行自定義代碼,并從歷史記錄表中洗掉另一個。在下一次運行中會發生相反的情況。
相同的雙重設定可用于預遷移掛鉤。
repo上有一個未處理的積壓專案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/381540.html
