运行 应用所有 EF Core 迁移后的代码
Run code after all EF Core migrations are applied
EF Core 5 有各种 events,但它们与 DbContext
有关。没有与迁移相关的事件 (Migration
)。
我想在应用所有迁移后 运行 自定义代码 - 无论是由代码 (context.Database.Migrate()
) 还是 CLI (dotnet ef database update
) 触发。
解决方法是添加一个“空”迁移,并将我的代码放在它的 Up
方法中。但是我每次添加迁移时都需要这样做。
假设没有我可以使用的事件或挂钩(有吗?),我如何在应用所有迁移后运行自定义代码?
这里有一个解决方法。
[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”)
- 都调用自定义代码,必须是幂等的
- 每个人都从历史记录中删除另一个人table
- 他们使用
Task.Run
异步优于同步
在每个 运行 期间,一个或另一个 运行 自定义代码,并从历史记录中删除另一个 table。在下一个 运行 会发生相反的情况。
相同的双重设置可用于预迁移挂钩。
repo 上有一个未完成的积压项目。
EF Core 5 有各种 events,但它们与 DbContext
有关。没有与迁移相关的事件 (Migration
)。
我想在应用所有迁移后 运行 自定义代码 - 无论是由代码 (context.Database.Migrate()
) 还是 CLI (dotnet ef database update
) 触发。
解决方法是添加一个“空”迁移,并将我的代码放在它的 Up
方法中。但是我每次添加迁移时都需要这样做。
假设没有我可以使用的事件或挂钩(有吗?),我如何在应用所有迁移后运行自定义代码?
这里有一个解决方法。
[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”)
- 都调用自定义代码,必须是幂等的
- 每个人都从历史记录中删除另一个人table
- 他们使用
Task.Run
异步优于同步
在每个 运行 期间,一个或另一个 运行 自定义代码,并从历史记录中删除另一个 table。在下一个 运行 会发生相反的情况。
相同的双重设置可用于预迁移挂钩。
repo 上有一个未完成的积压项目。