예제 #1
0
        public async Task Retries_BeginTransaction_on_execution_failure(bool async)
        {
            using var context = CreateContext();
            var connection = (TestNpgsqlConnection)context.GetService <INpgsqlRelationalConnection>();

            connection.OpenFailures.Enqueue(new bool?[] { true });

            Assert.Equal(ConnectionState.Closed, context.Database.GetDbConnection().State);

            if (async)
            {
                var transaction = await new TestNpgsqlRetryingExecutionStrategy(context).ExecuteAsync(
                    context,
                    c => context.Database.BeginTransactionAsync());

                transaction.Dispose();
            }
            else
            {
                var transaction = new TestNpgsqlRetryingExecutionStrategy(context).Execute(
                    context,
                    c => context.Database.BeginTransaction());

                transaction.Dispose();
            }

            Assert.Equal(2, connection.OpenCount);

            Assert.Equal(ConnectionState.Closed, context.Database.GetDbConnection().State);
        }
예제 #2
0
        public async Task Retries_query_on_execution_failure(bool externalStrategy, bool async)
        {
            CleanContext();

            using (var context = CreateContext())
            {
                context.Products.Add(new Product());
                context.Products.Add(new Product());

                context.SaveChanges();
            }

            using (var context = CreateContext())
            {
                var connection = (TestNpgsqlConnection)context.GetService <INpgsqlRelationalConnection>();

                connection.ExecutionFailures.Enqueue(new bool?[] { true });

                Assert.Equal(ConnectionState.Closed, context.Database.GetDbConnection().State);

                List <Product> list;
                if (async)
                {
                    if (externalStrategy)
                    {
                        list = await new TestNpgsqlRetryingExecutionStrategy(context)
                               .ExecuteAsync(context, (c, ct) => c.Products.ToListAsync(ct), null);
                    }
                    else
                    {
                        list = await context.Products.ToListAsync();
                    }
                }
                else
                {
                    if (externalStrategy)
                    {
                        list = new TestNpgsqlRetryingExecutionStrategy(context)
                               .Execute(context, c => c.Products.ToList(), null);
                    }
                    else
                    {
                        list = context.Products.ToList();
                    }
                }

                Assert.Equal(2, list.Count);
                Assert.Equal(1, connection.OpenCount);
                Assert.Equal(2, connection.ExecutionCount);

                Assert.Equal(ConnectionState.Closed, context.Database.GetDbConnection().State);
            }
        }