Как запустить EFCore Migrate при запуске ASP.NET с повторными попытками?

Поэтому я хочу выполнить миграцию EF при первом запуске службы приложений Azure. Следующий код работает правильно:

public class Program
{
    public static void Main(string[] args)
    {
        ...
        var host = CreateHostBuilder(args).Build();
        using (var scope = host.Services.CreateScope())
        using (var context = scope.ServiceProvider.GetService<MyContext>())
        {
             context.Database.Migrate();
        }
        host.Run();
        ...
     }
 }

Однако, поскольку база данных работает как бессерверный экземпляр в Azure, если она в настоящее время приостановлена, ей необходимо повторить попытку (поскольку первая попытка подключения не удалась).

После запуска службы для запросов я настроил повторные попытки, используя EnableRetryOnFailure - который работает как ожидалось:

services.AddDbContext<MyContext>(options =>
    {
        options.UseSqlServer(Configuration["...."],
           sqlServerOptionsAction: sqlOptions =>
           {
               sqlOptions.EnableRetryOnFailure(
                   maxRetryCount: 5,
                   maxRetryDelay: TimeSpan.FromSeconds(5),
                   errorNumbersToAdd: null);
           });
    });

Есть ли что-то подобное, что я могу использовать в Program.Main() обрабатывать миграцию запуска службы приложений?

Спасибо заранее!

1 ответ

Решение

Один из способов решить эту проблему - использовать Polly

Вы можете создать такую ​​политику:

    var migrateDbPolicy = Policy
        .Handle<Exception>()
        .WaitAndRetry(4, retryAttempt => TimeSpan.FromSeconds(retryAttempt));

    migrateDbPolicy.Execute(() =>
    {
        context.Database.Migrate();
    });

Таким образом, любой код, выполняющийся в методе выполнения, будет повторен, если будет обнаружено исключение, которое вы установили в политике.

Polly - очень мощная библиотека, которой доверяет Microsoft. Приведенный выше пример является очень простым. Вы можете применять разные политики для каждого типа исключения (универсальное исключение на самом деле не рекомендуется). У вас может быть разное время ожидания и т. Д.

Я бы посоветовал вам потратить немного времени и разобраться в этом.

Другие вопросы по тегам