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")]); }
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()); }
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); }