Как проверить стратегию выполнения структуры сущности? - PullRequest
0 голосов
/ 28 января 2019

У нас есть стратегия выполнения Entity Framework, закодированная в нашей более низкой среде.Как мы проверим это, чтобы показать, что оно действительно работает?Мы не хотим выпускать в Prod без того, чтобы сказать, что мы не вносим новых проблем.

1 Ответ

0 голосов
/ 15 февраля 2019

Самый простой способ - использовать некоторый слушатель, где вы можете выдать исключение и подписать этого слушателя на dbContext.

public class CommandListener
{
    [DiagnosticName("Microsoft.EntityFrameworkCore.Database.Command.CommandExecuting")]
    public void OnCommandExecuting(DbCommand command, DbCommandMethod executeMethod, Guid commandId, Guid connectionId, bool async, DateTimeOffset startTime)
    {
        throw new TimeoutException("Test exception");            
    }

    [DiagnosticName("Microsoft.EntityFrameworkCore.Database.Command.CommandExecuted")]
    public void OnCommandExecuted(object result, bool async)
    {
    }

    [DiagnosticName("Microsoft.EntityFrameworkCore.Database.Command.CommandError")]
    public void OnCommandError(Exception exception, bool async)
    {
    }
}

Подписаться слушателя на dbContext fi в Startup.cs

var context = provider.GetService<SomeDbContext>();
var listener = context.GetService<DiagnosticSource>();
(listener as DiagnosticListener).SubscribeWithAdapter(new CommandListener());

Поскольку TimeoutException является временным исключением в SqlServerRetryingExecutionStrategy.cs (если вы используете стратегию повторения по умолчанию), выполучит TimeoutException столько, сколько имеет ваша MaxRetryingCount настройки стратегии.Наконец, вы должны получить RetryLimitExceededException в результате запроса.

Вы должны увидеть TimeoutException в журналах своего приложения.Также неплохо включить журналы транзакций "Microsoft.EntityFrameworkCore.Database.Transaction": "Debug"

То, что я сделал, чтобы выработать стратегию переходных исключений и отладки (только для тестирования и игры с целью)

  1. Iдобавлено ExectuionStrategyBase.cs и TestServerRetryingExecutionStrategy.cs.Первый - это клон ExectuionStrategy.cs, а второй - клон SqlServerRetryingExecutionStrategy.cs
  2. В Startup.cs я установил стратегию повторных попыток

    strategy services.AddDbContext<SomeDbContext>(options => {options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), sqlOption => { sqlOption.ExecutionStrategy(dependencies => { return new TestSqlRetryingStrategy( dependencies, settings.SqlMaxRetryCount, settings.SqlMaxRetryDelay, null); });<br> });

  3. В OnCommandExecuting из CommandListener.sc я только что проверил некоторую статическую переменную bool, бросать или нет TimeoutException, и в ExectuionStrategyBase.cs я перевернул эту переменную.

Таким образом, мне удалось сгенерировать переходный процесс Exception при первом выполнении запроса и успешное выполнение при втором коротком замыкании.Теперь я думаю о какой-то долго выполняющейся транзакции и завершаю сеанс этой транзакции в SSCM во время ее выполнения.

Кроме того, я обнаружил, что при наличии запроса типа var users = context.Users.AsNoTracking().ToArrayAsync() стратегия выполнения не реализуется, и язастрял на нем.Я боролся с этим пару дней, но до сих пор ничего не могу понять.Если удалить AsNoTracking или заменить ToArrayAsync() чем-то вроде FirstAsync(), то все противники хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...