Как настроить стратегию выполнения для Oracle в EF Core 2.2?

Я хочу настроить стратегию выполнения для Oracle в Entity Framework Core 2.2 с помощью внедрения DbContext. Я использую пакет NuGet Oracle.EntityFrameworkCore для подключения к базе данных Oracle.

services.AddDbContext<MyContext>(options =>
        {
            options.UseOracle(configuration.GetConnectionString("MyConnection"), oracleOptionsAction: oracleOptions =>
            {
                oracleOptions.ExecutionStrategy(x => 
                    new MyExecutionStrategy();
            });
        });

Я создал следующий класс стратегии выполнения для тестирования. Оказывается, класс DbExecutionStrategy не существует в ядре dotnet:

public class MyExecutionStrategy : DbExecutionStrategy
{
    public MyExecutionStrategy() : base(10, TimeSpan.FromSeconds(30))
    {

    }

    protected override bool ShouldRetryOn(Exception exception)
    {
        return true;
    }
}

2 ответа

Класс DbExecutionStrategy не существует в ядре dotnet только в dotnet. Вместо этого вы должны реализовать абстрактный класс ExecutionStrategy. Класс настраиваемой стратегии выполнения должен быть определен следующим образом:

public class MyExecutionStrategy : ExecutionStrategy
{
    public MyExecutionStrategy(ExecutionStrategyDependencies dependencies, int maxRetryCount, TimeSpan maxRetryDelay) 
        : base(dependencies, maxRetryCount, maxRetryDelay)
    {

    }

    protected override bool ShouldRetryOn(Exception exception)
    {        
        return true;
    }
}

Затем раздел внедрения зависимостей:

services.AddDbContext(options =>
{
    options.UseOracle(configuration.GetConnectionString("MyConnection"), oracleOptionsAction: oracleOptions =>
    {
        oracleOptions.ExecutionStrategy(dependencies => 
            new MyExecutionStrategy(
            dependencies,
            retryCount,
            retryDelay));
    });
});

Для Oracle предпочтительнее использовать OracleRetryingExecutionStrategyкласс Oracle.EntityFrameworkCoreпространство имен. Он уже наследуется от ExecutionStrategyи имеет дополнительный параметр конструктора, которому вы можете передать набор кодов ошибок Oracle для повторной попытки.

Например, вот реализация некоторого класса с параметрами повтора по умолчанию и некоторым добавленным кодом Oracle для повтора:

      public class SomeRetryStrategy : OracleRetryingExecutionStrategy
{
    private static readonly IList<int> ErrorNumbersToRetry = new List<int>()
    {
        28,    // ORA-00028: Your session has been killed
        12570  // ORA-12570: Network Session: Unexpected packet read error
    };

    public SomeRetryStrategy(ExecutionStrategyDependencies dependencies)
        : base(dependencies, DefaultMaxRetryCount, DefaultMaxDelay, ErrorNumbersToRetry)
    {
    }
}
Другие вопросы по тегам