Как настроить стратегию выполнения для 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)
{
}
}