Пример #1
0
        public void CommitFailureHandler_PruneTransactionHistoryAsync_does_not_catch_exceptions()
        {
            var failingTransactionInterceptor = new FailingTransactionInterceptor();

            DbInterception.Add(failingTransactionInterceptor);

            try
            {
                CommitFailureHandler_with_ExecutionStrategy_test(
                    (c, executionStrategyMock) =>
                {
                    MutableResolver.AddResolver <Func <IDbExecutionStrategy> >(
                        key => (Func <IDbExecutionStrategy>)(() => new SimpleExecutionStrategy()));

                    failingTransactionInterceptor.ShouldFailTimes = 1;
                    failingTransactionInterceptor.ShouldRollBack  = true;

                    Assert.Throws <EntityException>(
                        () => ExceptionHelpers.UnwrapAggregateExceptions(
                            () => ((MyCommitFailureHandler)c.TransactionHandler).PruneTransactionHistoryAsync().Wait()));

                    AssertTransactionHistoryCount(c, 1);

                    ((MyCommitFailureHandler)c.TransactionHandler).PruneTransactionHistoryAsync().Wait();

                    AssertTransactionHistoryCount(c, 0);
                });
            }
            finally
            {
                DbInterception.Remove(failingTransactionInterceptor);
            }
        }
Пример #2
0
        private void CommitFailureHandler_prunes_transactions_after_set_amount_implementation(bool shouldThrow)
        {
            var failingTransactionInterceptor = new FailingTransactionInterceptor();

            DbInterception.Add(failingTransactionInterceptor);

            MutableResolver.AddResolver <Func <TransactionHandler> >(
                new TransactionHandlerResolver(() => new MyCommitFailureHandler(c => new TransactionContext(c)), null, null));

            try
            {
                using (var context = new BlogContextCommit())
                {
                    context.Database.Delete();
                    Assert.Equal(1, context.Blogs.Count());

                    var objectContext      = ((IObjectContextAdapter)context).ObjectContext;
                    var transactionHandler = (MyCommitFailureHandler)objectContext.TransactionHandler;

                    for (var i = 0; i < transactionHandler.PruningLimit; i++)
                    {
                        context.Blogs.Add(new BlogContext.Blog());
                        context.SaveChanges();
                    }

                    AssertTransactionHistoryCount(context, transactionHandler.PruningLimit);

                    if (shouldThrow)
                    {
                        failingTransactionInterceptor.ShouldFailTimes = 1;
                        failingTransactionInterceptor.ShouldRollBack  = false;
                    }

                    context.Blogs.Add(new BlogContext.Blog());
                    context.SaveChanges();

                    context.Blogs.Add(new BlogContext.Blog());
                    context.SaveChanges();

                    AssertTransactionHistoryCount(context, 1);
                    Assert.Equal(1, transactionHandler.TransactionContext.ChangeTracker.Entries <TransactionRow>().Count());
                }
            }
            finally
            {
                DbInterception.Remove(failingTransactionInterceptor);
                MutableResolver.ClearResolvers();
            }

            DbDispatchersHelpers.AssertNoInterceptors();
        }
Пример #3
0
        private static void Execute_commit_failure_test(
            Action <BlogContextCommit> runAndVerify, int expectedBlogs, bool useTransactionHandler, bool useExecutionStrategy,
            bool rollbackOnFail)
        {
            var failingTransactionInterceptor = new FailingTransactionInterceptor();

            DbInterception.Add(failingTransactionInterceptor);

            if (useTransactionHandler)
            {
                MutableResolver.AddResolver <Func <TransactionHandler> >(
                    new TransactionHandlerResolver(() => new CommitFailureHandler(), null, null));
            }

            if (useExecutionStrategy)
            {
                MutableResolver.AddResolver <Func <IDbExecutionStrategy> >(
                    key => (Func <IDbExecutionStrategy>)(() => new SqlAzureExecutionStrategy()));
            }

            try
            {
                using (var context = new BlogContextCommit())
                {
                    FailingTransactionInterceptor.ShouldFailTimes = 0;
                    context.Database.Delete();
                    Assert.Equal(1, context.Blogs.Count());

                    FailingTransactionInterceptor.ShouldFailTimes = 1;
                    FailingTransactionInterceptor.ShouldRollBack  = rollbackOnFail;

                    context.Blogs.Add(new BlogContext.Blog());
                    runAndVerify(context);
                }

                using (var context = new BlogContextCommit())
                {
                    Assert.Equal(expectedBlogs, context.Blogs.Count());
                }
            }
            finally
            {
                DbInterception.Remove(failingTransactionInterceptor);
                MutableResolver.ClearResolvers();
            }

            DbDispatchersHelpers.AssertNoInterceptors();
        }