【问题标题】:How to run EFCore Migrate on ASP.NET start up WITH retries?如何在 ASP.NET 上运行 EFCore Migrate 启动并重试?
【发布时间】:2021-03-07 11:23:58
【问题描述】:

所以我想在 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() 中使用类似的东西来处理应用服务启动迁移吗?

非常感谢!

【问题讨论】:

    标签: .net entity-framework-core ef-core-3.1 ef-core-3.0 ef-core-5.0


    【解决方案1】:

    解决这个问题的一种方法是使用Polly

    您可以创建如下策略:

        var migrateDbPolicy = Policy
            .Handle<Exception>()
            .WaitAndRetry(4, retryAttempt => TimeSpan.FromSeconds(retryAttempt));
    
        migrateDbPolicy.Execute(() =>
        {
            context.Database.Migrate();
        });
    

    因此,如果捕获到您在策略中设置的异常,则将重试运行到 execute 方法的任何代码。

    Polly 是微软信任的一个非常强大的库。上面的例子是一个非常基本的例子。您可以对每种类型的异常应用不同的策略(不建议使用通用异常)。您可以有不同的等待时间等。

    我建议你花点时间深入研究一下。

    【讨论】:

    • 谢谢 Stelios,我会调查的。我曾接触过 Polly 重试 API 调用 - 没有考虑使用它来重试 Migrate!我会试一试,如果工作正常并且没有人很快回来使用本机 EF 解决方案,我会选择这个作为答案。
    猜你喜欢
    • 2021-09-27
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 2016-07-08
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多