如何 运行 EFCore Migrate on ASP.NET 启动时重试?
How to run EFCore Migrate on ASP.NET start up WITH retries?
所以我想 运行 首次启动 Azure 应用服务时进行 EF 迁移。以下代码可以正常工作:
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()
中使用类似的东西来处理应用程序服务启动迁移吗?
非常感谢!
解决这个问题的一种方法是使用Polly
您可以创建如下策略:
var migrateDbPolicy = Policy
.Handle<Exception>()
.WaitAndRetry(4, retryAttempt => TimeSpan.FromSeconds(retryAttempt));
migrateDbPolicy.Execute(() =>
{
context.Database.Migrate();
});
因此,如果您在策略中设置的异常被捕获,那么执行方法中的任何代码 运行 都会被重试。
Polly 是 Microsoft 信任的非常强大的库。上面的例子是一个非常基本的例子。您可以对每种类型的异常应用不同的策略(不建议使用通用异常)。您可以有不同的等待时间等
我建议你花点时间深入研究一下。
所以我想 运行 首次启动 Azure 应用服务时进行 EF 迁移。以下代码可以正常工作:
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()
中使用类似的东西来处理应用程序服务启动迁移吗?
非常感谢!
解决这个问题的一种方法是使用Polly
您可以创建如下策略:
var migrateDbPolicy = Policy
.Handle<Exception>()
.WaitAndRetry(4, retryAttempt => TimeSpan.FromSeconds(retryAttempt));
migrateDbPolicy.Execute(() =>
{
context.Database.Migrate();
});
因此,如果您在策略中设置的异常被捕获,那么执行方法中的任何代码 运行 都会被重试。
Polly 是 Microsoft 信任的非常强大的库。上面的例子是一个非常基本的例子。您可以对每种类型的异常应用不同的策略(不建议使用通用异常)。您可以有不同的等待时间等
我建议你花点时间深入研究一下。