public async Task ExecuteAsync_calls_Commit_if_no_transaction()
        {
            var mockModificationCommandBatch = new Mock<ModificationCommandBatch>();
            mockModificationCommandBatch.Setup(m => m.ModificationCommands.Count).Returns(1);

            var mockRelationalConnection = new Mock<IRelationalConnection>();
            var transactionMock = new Mock<IRelationalTransaction>();

            IRelationalTransaction currentTransaction = null;
            mockRelationalConnection.Setup(m => m.BeginTransaction()).Returns(() => currentTransaction = transactionMock.Object);
            mockRelationalConnection.Setup(m => m.Transaction).Returns(() => currentTransaction);

            var cancellationToken = new CancellationTokenSource().Token;

            var batchExecutor = new BatchExecutor();

            await batchExecutor.ExecuteAsync(new[] { mockModificationCommandBatch.Object }, mockRelationalConnection.Object, cancellationToken);

            mockRelationalConnection.Verify(rc => rc.OpenAsync(cancellationToken));
            mockRelationalConnection.Verify(rc => rc.Close());
            transactionMock.Verify(t => t.Commit());

            mockModificationCommandBatch.Verify(mcb => mcb.ExecuteAsync(
                It.IsAny<IRelationalConnection>(),
                cancellationToken));
        }
        public async void Exception_thrown_if_rows_returned_for_command_without_store_generated_values()
        {
            var stateEntry = CreateStateEntry(EntityState.Added);
            var command    = new ModificationCommand("T1", new ParameterNameGenerator());

            command.AddStateEntry(stateEntry);

            var batch      = new ModificationCommandBatch(new[] { command });
            var mockReader = SetupMockDataReader(new[] { "Col1" }, new List <object[]> {
                new object[] { 42 }
            });
            var connection = SetupMockConnection(mockReader.Object);

            var executor = new BatchExecutor(new Mock <SqlGenerator> {
                CallBase = true
            }.Object, connection, new RelationalTypeMapper());

            Assert.Equal(Strings.FormatUpdateConcurrencyException(0, 1),
                         (await Assert.ThrowsAsync <DbUpdateConcurrencyException>(
                              async() => await executor.ExecuteAsync(new[] { batch }))).Message);
        }
        public async void ExecuteAsync_saves_store_generated_values()
        {
            var stateEntry = CreateStateEntry(EntityState.Added, ValueGenerationOnSave.WhenInserting);
            var command    = new ModificationCommand("T1", new ParameterNameGenerator());

            command.AddStateEntry(stateEntry);

            var batch      = new ModificationCommandBatch(new[] { command });
            var mockReader = SetupMockDataReader(new[] { "Col1" }, new List <object[]> {
                new object[] { 42 }
            });
            var connection = SetupMockConnection(mockReader.Object);

            var executor = new BatchExecutor(new Mock <SqlGenerator> {
                CallBase = true
            }.Object, connection, new RelationalTypeMapper());

            await executor.ExecuteAsync(new[] { batch });

            Assert.Equal(42, stateEntry[stateEntry.EntityType.GetProperty("Col1")]);
            Assert.Equal("Test", stateEntry[stateEntry.EntityType.GetProperty("Col2")]);
        }
示例#4
0
        public override async Task <int> SaveChangesAsync(
            IReadOnlyList <StateEntry> stateEntries,
            CancellationToken cancellationToken = default(CancellationToken))
        {
            Check.NotNull(stateEntries, "stateEntries");

            var commands = _batchPreparer.BatchCommands(stateEntries);

            await _connection.OpenAsync(cancellationToken);

            try
            {
                await _batchExecutor.ExecuteAsync(commands, cancellationToken);
            }
            finally
            {
                _connection.Close();
            }

            // TODO Return the actual results once we can get them
            return(stateEntries.Count());
        }
示例#5
0
        public async Task ExecuteAsync_does_not_call_Commit_if_existing_transaction()
        {
            var mockModificationCommandBatch = new Mock <ModificationCommandBatch>();

            var transactionMock          = new Mock <RelationalTransaction>();
            var mockRelationalConnection = new Mock <RelationalConnection>();

            mockRelationalConnection.Setup(m => m.Transaction).Returns(transactionMock.Object);

            var cancellationToken = new CancellationTokenSource().Token;

            var relationalTypeMapper = new RelationalTypeMapper();
            var batchExecutor        = new BatchExecutor(relationalTypeMapper);

            await batchExecutor.ExecuteAsync(new[] { mockModificationCommandBatch.Object }, mockRelationalConnection.Object, cancellationToken);

            mockRelationalConnection.Verify(rc => rc.OpenAsync(cancellationToken));
            mockRelationalConnection.Verify(rc => rc.Close());
            mockRelationalConnection.Verify(rc => rc.BeginTransaction(), Times.Never);
            transactionMock.Verify(t => t.Commit(), Times.Never);
            mockModificationCommandBatch.Verify(mcb => mcb.ExecuteAsync(It.IsAny <RelationalTransaction>(), relationalTypeMapper, cancellationToken));
        }
        public async void Exception_thrown_for_more_than_one_row_returned_for_single_command()
        {
            var stateEntry = CreateStateEntry(EntityState.Added, ValueGenerationOnSave.WhenInserting);
            var command    = new ModificationCommand("T1", new ParameterNameGenerator());

            command.AddStateEntry(stateEntry);

            var batch      = new ModificationCommandBatch(new[] { command });
            var mockReader = SetupMockDataReader(new[] { "Col1" }, new List <object[]>
            {
                new object[] { 42 },
                new object[] { 43 }
            });
            var connection = SetupMockConnection(mockReader.Object);

            var executor = new BatchExecutor(new Mock <SqlGenerator> {
                CallBase = true
            }.Object, connection, new RelationalTypeMapper());

            Assert.Equal(Strings.TooManyRowsForModificationCommand,
                         (await Assert.ThrowsAsync <DbUpdateException>(
                              async() => await executor.ExecuteAsync(new[] { batch }))).Message);
        }