【问题标题】:Run code after all EF Core migrations are applied在应用所有 EF Core 迁移后运行代码
【发布时间】:2022-01-15 15:06:43
【问题描述】:

EF Core 5 有各种events,但它们与DbContext 相关。没有与迁移相关的事件 (Migration)。

我想在应用所有迁移后运行自定义代码 - 无论是由代码 (context.Database.Migrate()) 还是 CLI (dotnet ef database update) 触发。

解决方法是添加一个“空”迁移,并将我的代码放在它的Up 方法中。但每次添加迁移时我都需要这样做。

假设没有可以使用的事件或钩子(有吗?),在应用所有迁移后如何运行自定义代码?

【问题讨论】:

    标签: c# .net entity-framework entity-framework-core entity-framework-migrations


    【解决方案1】:

    这里有一个解决方法。

    [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 上有一个未完成的待办事项。

    【讨论】:

      猜你喜欢
      • 2015-10-21
      • 2020-10-02
      • 1970-01-01
      • 2017-12-07
      • 2021-11-23
      • 1970-01-01
      • 2021-10-02
      • 2021-12-31
      • 1970-01-01
      相关资源
      最近更新 更多