Как запустить 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. Приведенный выше пример является очень простым. Вы можете применять разные политики для каждого типа исключения (универсальное исключение на самом деле не рекомендуется). У вас может быть разное время ожидания и т. Д.
Я бы посоветовал вам потратить немного времени и разобраться в этом.