EF Core 5 tiene varios eventos , pero se relacionan con DbContext . No hay eventos relacionados con migraciones ( Migration ).
Quiero ejecutar un código personalizado después de que se apliquen todas las migraciones, ya sea que se active por código ( context.Database.Migrate() ) o CLI (actualización de la base de dotnet ef database update ).
La solución es agregar una migración "vacía" y colocar mi código en su método Up . Pero necesitaría hacer eso cada vez que agregue una migración.
Suponiendo que no hay ningún evento o enlace que pueda usar (¿hay?), ¿cómo puedo ejecutar un código personalizado después de aplicar todas las migraciones?
Aquí hay una solución.
[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); } }Hay dos "últimas" migraciones:
Task.Run para asíncrono sobre sincronizaciónDurante cada ejecución, uno u otro ejecuta el código personalizado y elimina el otro de la tabla de historial. En la siguiente ejecución ocurriría lo contrario.
La misma configuración doble se puede usar para un enlace previo a la migración.
Hay un elemento pendiente pendiente en el repositorio .