Мы столкнулись с отказом устойчивости, и добавление EnableRetryOnFailure() было решением, которое я настроил.
Код: Выделить всё
services.AddEntityFrameworkSqlServer()
.AddDbContext(options => options.UseSqlServer(Configuration.GetConnectionString("DataContext"), sqlServerOptionsAction: sqlActions =>
{
sqlActions.EnableRetryOnFailure(
maxRetryCount: 10,
maxRetryDelay: TimeSpan.FromSeconds(5),
errorNumbersToAdd: null);
}), ServiceLifetime.Transient);
"Настроенная стратегия выполнения "SqlServerRetryingExecutionStrategy" не поддерживает транзакции, инициированные пользователем. Используйте стратегию выполнения, возвращаемую "DbContext.Database.CreateExecutionStrategy()", чтобы выполнить все операции в транзакции как повторяемую единицу."
Я просмотрел документы MS, и они предлагают способ определить стратегию выполнения вручную с помощью ExecuteAsync.
Это стало проблемой, поскольку у нас есть более 25+ мест, где у нас есть эти транзакции. Я пытался использовать собственную ExecutionStrategy на уровне DbContext, но это не помогло:
Код: Выделить всё
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured && !string.IsNullOrEmpty(ConnectionString))
{
optionsBuilder.UseSqlServer(ConnectionString, options =>
{
options.ExecutionStrategy((dependencies) =>
{
return new SqlServerRetryingExecutionStrategy(dependencies, maxRetryCount: 3, maxRetryDelay: TimeSpan.FromSeconds(5), errorNumbersToAdd: new List { 4060 });
});
});
}
}
Подробнее здесь: https://stackoverflow.com/questions/723 ... in-ef-core
Мобильная версия