public void ShouldInsertData(Type fixtureType) { var fixture = Activator.CreateInstance(fixtureType) as CrudCommandFixtureBase; fixture.CreateDatabase(); fixture.CreateTables(); var insertCommandBuilder = fixture.Connector.GetCommandBuilderFactory().CreateInsertCommandBuilder(fixture.GetParentDescriptor()); var entityToInsert = fixture.CreateNewEntity(); entityToInsert.Should().NotBeNull(); insertCommandBuilder.Should().NotBeNull(); var valueProvider = new ClassValueProvider(fixture.Connector, new List <object> { entityToInsert }); valueProvider.MoveNext(); var insertCommand = insertCommandBuilder.GetCommand(valueProvider); if (fixtureType == typeof(CqlCrudCommandFixture)) { insertCommand.ExecuteNonQuery().Should().Be(-1); } else { insertCommand.ExecuteNonQuery().Should().Be(1); } fixture.DropDatabase(); }
public void ShouldGetTheLastInsertedIdData(Type fixtureType) { var fixture = Activator.CreateInstance(fixtureType) as CrudCommandFixtureBase; fixture.Should().NotBeNull(); fixture.CreateDatabase(); fixture.CreateTables(); var valueProvider = new ClassValueProvider(fixture.Connector, new List <object> { fixture.CreateNewEntity() }); valueProvider.MoveNext(); var insertCommandBuilder = fixture.Connector.GetCommandBuilderFactory().CreateInsertCommandBuilder(fixture.GetParentDescriptor()); var lastInsertIdCommandBuilder = fixture.Connector.GetCommandBuilderFactory().CreateLastInsertIdCommandBuilder(fixture.GetParentDescriptor()); var insertCommand = insertCommandBuilder.GetCommand(valueProvider); var lastInsertCommand = lastInsertIdCommandBuilder.GetCommand(); insertCommand.CommandText += fixture.Connector.GetCommandFormatProvider().GetQuerySeparator() + lastInsertCommand.CommandText; using (var reader = insertCommand.ExecuteReader()) { reader.Should().NotBeNull(); reader.Read().Should().BeTrue(); Convert.ToInt32(reader.GetValue(0)).Should().BeGreaterThan(0); } fixture.DropDatabase(); }
/// <summary> /// Deletes a list of objects from the table or view. /// </summary> /// <param name="entities">List of entities to delete.</param> /// <returns></returns> /// <exception cref="System.ArgumentException">entities can not be null.</exception> /// <remarks> /// This method utilizes batching to prevent unnecessary roundtrips to the database. /// </remarks> public virtual async Task DeleteAsync(IEnumerable <object> entities) { if (entities == null) { throw new ArgumentException(nameof(entities), $"{nameof(entities)} can not be null."); } var entityList = entities as List <object> ?? entities.ToList(); if (!entityList.Any()) { return; } foreach (var x in this.NavigationDatabaseAccesses) { await x.DeleteBeforeAsync(entityList); } var valueProvider = new ClassValueProvider(this.Connector, entityList); await this.Connector.ExecuteNonQueryAsync(this.CommandBuilderManager.DeleteCommandBuilder.GetCommand(valueProvider)); foreach (var x in this.NavigationDatabaseAccesses) { await x.DeleteAfterAsync(entityList); } }
public void ShouldSelectOneMultipleKeyData(Type fixtureType) { var fixture = Activator.CreateInstance(fixtureType) as CrudCommandFixtureBase; fixture.CreateDatabase(); fixture.CreateTables(); var first = fixture.CreateNewTwoKeysEntity(); var second = fixture.CreateNewTwoKeysEntity(); var valueProvider = new ClassValueProvider(fixture.Connector, new List <object> { first, second }); var insertCommandBuilder = fixture.Connector.GetCommandBuilderFactory().CreateInsertCommandBuilder(fixture.GetMultipleKeyDescriptor()); valueProvider.MoveNext(); insertCommandBuilder.GetCommand(valueProvider).ExecuteNonQuery(); valueProvider.MoveNext(); insertCommandBuilder.GetCommand(valueProvider).ExecuteNonQuery(); var selectOneCommandBuilder = fixture.Connector.GetCommandBuilderFactory().CreateSelectOneCommandBuilder(fixture.GetMultipleKeyDescriptor()); var selectCommand = (fixtureType == typeof(CqlCrudCommandFixture)) ? selectOneCommandBuilder.GetCommand(1, 2, ((Mocks.Cql.TwoPrimaryKeyTable)first).Date) : selectOneCommandBuilder.GetCommand(1, 2); using (var reader = selectCommand.ExecuteReader()) { var mapper = new DatabaseReaderMapper(fixture.Connector, fixture.GetMultipleKeyDescriptor()); var results = mapper.Map(reader); results.Should().NotBeNull().And.HaveCount(1); } fixture.DropDatabase(); }
public void ShouldSelectAllMultipleKeyData(Type fixtureType) { var fixture = Activator.CreateInstance(fixtureType) as CrudCommandFixtureBase; fixture.CreateDatabase(); fixture.CreateTables(); var valueProvider = new ClassValueProvider(fixture.Connector, new List <object> { fixture.CreateNewTwoKeysEntity(), fixture.CreateNewTwoKeysEntity() }); var insertCommandBuilder = fixture.Connector.GetCommandBuilderFactory().CreateInsertCommandBuilder(fixture.GetMultipleKeyDescriptor()); valueProvider.MoveNext(); insertCommandBuilder.GetCommand(valueProvider).ExecuteNonQuery(); valueProvider.MoveNext(); insertCommandBuilder.GetCommand(valueProvider).ExecuteNonQuery(); var selectCommandBuilder = fixture.Connector.GetCommandBuilderFactory().CreateSelectCommandBuilder(fixture.GetMultipleKeyDescriptor()); var selectCommand = selectCommandBuilder.GetCommand(); using (var reader = selectCommand.ExecuteReader()) { var mapper = new DatabaseReaderMapper(fixture.Connector, fixture.GetMultipleKeyDescriptor()); var results = mapper.Map(reader); results.Should().NotBeNull().And.HaveCount(2); } fixture.DropDatabase(); }
/// <summary> /// Inserts a list of objects into the table or view. /// </summary> /// <param name="entities">List of entities to insert.</param> /// <returns></returns> /// <exception cref="System.ArgumentNullException">entities can not be null.</exception> /// <remarks> /// This method utilizes batching to prevent unnecessary round trips to the database. /// </remarks> public virtual async Task InsertAsync(IEnumerable <object> entities) { if (entities == null) { throw new ArgumentNullException(nameof(entities), $"{nameof(entities)} can not be null."); } var entityList = entities as List <object> ?? entities.ToList(); if (!entityList.Any()) { return; } // 1. Save 1-1 relationships first, as we'll need the ids of the related entities // for the main entities to be stored later. foreach (var navigationDatabaseAccess in this.NavigationDatabaseAccesses) { await navigationDatabaseAccess.SaveBeforeAsync(entityList); } // 2. Use a batch manager to save the main entities using (var batchManager = this.CreateBatchManager()) { var valueProvider = new ClassValueProvider(this.Connector, entityList); // don't use the async move next because the class provider // is not really async right now. while (valueProvider.MoveNext()) { using (var command = this.CommandBuilderManager.InsertCommandBuilder.GetCommand(valueProvider)) { batchManager.Add(new CommandBatchStep(command)); } // if the entity has an auto incremental property, // queue a command to retrieve the id from the last insertion. if (this.Descriptor.IdentityProperty != null) { var entity = valueProvider.CurrentEntity; using (var command = this.CommandBuilderManager.LastInsertIdCommandBuilder.GetCommand()) { batchManager.Add(new CommandBatchStep(command, async reader => await this.SetEntityIdAsync(entity, reader))); } } } await batchManager.ExecuteAsync(); } // 3. Save the 1-Many relationship at last, as they'll need the // main entity id before being stored. foreach (var navigationDatabaseAccess in this.NavigationDatabaseAccesses) { await navigationDatabaseAccess.SaveAfterAsync(entityList); } }
public void ShouldDeleteData(Type fixtureType) { var fixture = Activator.CreateInstance(fixtureType) as CrudCommandFixtureBase; fixture.Should().NotBeNull(); fixture.CreateDatabase(); fixture.CreateTables(); var first = fixture.CreateNewEntity(); var second = fixture.CreateNewEntity(); var insertCommandBuilder = fixture.Connector.GetCommandBuilderFactory().CreateInsertCommandBuilder(fixture.GetParentDescriptor()); { var valueProvider = new ClassValueProvider(fixture.Connector, new List <object> { first, second }); valueProvider.MoveNext(); insertCommandBuilder.GetCommand(valueProvider).ExecuteNonQuery(); valueProvider.MoveNext(); insertCommandBuilder.GetCommand(valueProvider).ExecuteNonQuery(); } var deleteCommandBuilder = fixture.Connector.GetCommandBuilderFactory().CreateDeleteCommandBuilder(fixture.GetParentDescriptor()); { fixture.SetEntityId(first, second); var valueProvider = new ClassValueProvider(fixture.Connector, new List <object> { first, second }); valueProvider.MoveNext(); var deleteCommand = deleteCommandBuilder.GetCommand(valueProvider); deleteCommand.Invoking(c => c.ExecuteNonQuery()).Should().NotThrow(); valueProvider.MoveNext(); deleteCommand = deleteCommandBuilder.GetCommand(valueProvider); deleteCommand.Invoking(c => c.ExecuteNonQuery()).Should().NotThrow(); } var selectCommandBuilder = fixture.Connector.GetCommandBuilderFactory().CreateSelectCommandBuilder(fixture.GetParentDescriptor()); { var selectCommand = selectCommandBuilder.GetCommand(); using (var reader = selectCommand.ExecuteReader()) { var mapper = new DatabaseReaderMapper(fixture.Connector, fixture.GetParentDescriptor()); var results = mapper.Map(reader); results.Should().NotBeNull().And.HaveCount(0); } } fixture.DropDatabase(); }
/// <summary> /// Inserts a list of objects into the table or view. /// </summary> /// <param name="entities">List of entities to insert.</param> /// <exception cref="System.ArgumentNullException">entities can not be null.</exception> /// <remarks> /// This method utilizes batching to prevent unnecessary roundtrips to the database. /// </remarks> public virtual void Insert(IEnumerable <object> entities) { if (entities == null) { throw new ArgumentNullException(nameof(entities), $"{nameof(entities)} can not be null."); } var entityList = entities as List <object> ?? entities.ToList(); if (!entityList.Any()) { return; } // 1. Save 1-1 relationships first, as we'll need the ids of the related entities // for the main entities to be stored later. foreach (var navigationDatabaseAccess in this.NavigationDatabaseAccesses) { if (!navigationDatabaseAccess.NavigationPropertyDescriptor.IsAggregateRoot) { navigationDatabaseAccess.SaveBefore(entityList); } } // 2. Save the main entities, and batch the queries. this.BatchManager.Reset(); var valueProvider = new ClassValueProvider(this.Connector, entityList); while (valueProvider.MoveNext()) { this.BatchManager.Add(new CommandBatchStep(this.CommandBuilderManager.InsertCommandBuilder.GetCommand(valueProvider))); // if the entity has an auto incremental property, // queue a command to retrieve the id from the last insertion. if (this.Descriptor.IdentityProperty != null) { var entity = valueProvider.CurrentEntity; this.BatchManager.Add(new CommandBatchStep(this.CommandBuilderManager.LastInsertIdCommandBuilder.GetCommand(), reader => this.SetEntityId(entity, reader))); } } this.BatchManager.Execute(); // 3. Save the 1-Many relationship at last, as they'll need the // main entity id before being stored. foreach (var navigationDatabaseAccess in this.NavigationDatabaseAccesses) { if (navigationDatabaseAccess.NavigationPropertyDescriptor.IsAggregateRoot) { navigationDatabaseAccess.SaveAfter(entityList); } } }
public void ShouldCreateADeleteCommandForASingleEntityWithMultipleKeys(Type fixtureType, Type tableDescriptorType) { var fixture = Activator.CreateInstance(fixtureType) as CommandBuilderFixtureBase; var commandBuilderFactory = fixture.Connector.GetCommandBuilderFactory(); var tableDescription = DescriptorCache.Instance.GetTableTypeDescriptor(tableDescriptorType); var entitiesToDelete = new[] { fixture.TwoPrimaryKeyEntity1 }; var valueProvider = new ClassValueProvider(fixture.Connector, entitiesToDelete.Cast <object>().ToList()); var deleteCommand = commandBuilderFactory.CreateDeleteCommandBuilder(tableDescription); deleteCommand.GetCommand(valueProvider).CommandText.Should().Be(fixture.DeleteOneEntityQueryMultipleKey); }
public void CorrectDeleteCommandTwoEntities(Type fixtureType, Type tableDescriptorType) { var fixture = Activator.CreateInstance(fixtureType) as CommandBuilderFixtureBase; var commandBuilderFactory = fixture.Connector.GetCommandBuilderFactory(); var tableDescription = new TableTypeDescriptor(tableDescriptorType); var entitiesToDelete = new[] { fixture.Entity1, fixture.Entity2 }; var valueProvider = new ClassValueProvider(fixture.Connector, entitiesToDelete.Cast <object>().ToList()); using (var deleteCommand = commandBuilderFactory.CreateDeleteCommandBuilder(tableDescription)) { deleteCommand.GetCommand(valueProvider).CommandText.Should().Be(fixture.DeleteTwoEntitiesQuery); } }
public void ShouldAddACommandToTheCommandBatch(Type fixtureType) { var fixture = Activator.CreateInstance(fixtureType) as CommandBatchFixtureBase; var commandBatch = new CommandBatch(fixture.Connector); var commandBuilderFactory = fixture.Connector.GetCommandBuilderFactory(); var tableTypeDescriptor = DescriptorCache.Instance.GetTableTypeDescriptor(typeof(BatchMock)); var valueProvider = new ClassValueProvider(fixture.Connector, new List <object> { fixture.CreateMock(), fixture.CreateMock() }); commandBatch.Add(new CommandBatchStep(commandBuilderFactory.CreateInsertCommandBuilder(tableTypeDescriptor).GetCommand(valueProvider))); commandBatch.Add(new CommandBatchStep(commandBuilderFactory.CreateInsertCommandBuilder(tableTypeDescriptor).GetCommand(valueProvider))); commandBatch.GetCommand().CommandText.Should().Be(fixture.CommandBatchText); }
/// <summary> /// Updates a list of objects stored in the table or view. /// </summary> /// <param name="entities">List of entities to update.</param> /// <returns></returns> /// <exception cref="System.ArgumentNullException">entities can not be null.</exception> /// <remarks> /// This method utilizes batching to prevent unnecessary roundtrips to the database. /// </remarks> public virtual async Task UpdateAsync(IEnumerable <object> entities) { if (entities == null) { throw new ArgumentNullException(nameof(entities), $"{nameof(entities)} can not be null."); } var entityList = entities as List <object> ?? entities.ToList(); if (!entityList.Any()) { return; } // 1. Save 1-1 relationships first, as we'll need the ids of the related entities // for the main entities to be stored later. foreach (var navigationDatabaseAccess in this.NavigationDatabaseAccesses) { if (!navigationDatabaseAccess.NavigationPropertyDescriptor.IsAggregateRoot) { await navigationDatabaseAccess.SaveBeforeAsync(entityList); } } // 2. Save the main entities, and batch the queries. this.BatchManager.Reset(); var valueProvider = new ClassValueProvider(this.Connector, entityList); while (valueProvider.MoveNext()) { this.BatchManager.Add(new CommandBatchStep(this.CommandBuilderManager.UpdateCommandBuilder.GetCommand(valueProvider))); } await this.BatchManager.ExecuteAsync(); // 3. Save the 1-Many relationship at last, as they'll need the // main entity id before being stored. foreach (var navigationDatabaseAccess in this.NavigationDatabaseAccesses) { if (navigationDatabaseAccess.NavigationPropertyDescriptor.IsAggregateRoot) { await navigationDatabaseAccess.SaveAfterAsync(entityList); } } }
public void ShouldSelectOneData(Type fixtureType) { var fixture = Activator.CreateInstance(fixtureType) as CrudCommandFixtureBase; fixture.Should().NotBeNull(); fixture.CreateDatabase(); fixture.CreateParentTable(); fixture.CreateChildTable(); var first = fixture.CreateNewEntity(); var second = fixture.CreateNewEntity(); var valueProvider = new ClassValueProvider(fixture.Connector, new List <object> { first, second }); using (var insertCommandBuilder = fixture.Connector.GetCommandBuilderFactory().CreateInsertCommandBuilder(fixture.GetParentDescriptor())) { valueProvider.MoveNext(); insertCommandBuilder.GetCommand(valueProvider).ExecuteNonQuery(); valueProvider.MoveNext(); insertCommandBuilder.GetCommand(valueProvider).ExecuteNonQuery(); } using (var selectOneCommandBuilder = fixture.Connector.GetCommandBuilderFactory().CreateSelectOneCommandBuilder(fixture.GetParentDescriptor())) { selectOneCommandBuilder.Should().NotBeNull(); var selectCommand = selectOneCommandBuilder.GetCommand(1); selectCommand.Should().NotBeNull(); selectCommand.CommandText.Should().Be(fixture.SelectOneStatement); using (var reader = selectCommand.ExecuteReader()) { reader.Should().NotBeNull(); var mapper = new DatabaseReaderMapper(fixture.Connector, fixture.GetParentDescriptor()); var results = mapper.Map(reader); results.Should().NotBeNull().And.HaveCount(1); } } fixture.DropDatabase(); }
/// <summary> /// Updates a list of objects stored in the table or view. /// </summary> /// <param name="entities">List of entities to update.</param> /// <exception cref="System.ArgumentNullException">entities can not be null.</exception> /// <remarks> /// This method utilizes batching to prevent unnecessary round trips to the database. /// </remarks> public virtual void Update(IEnumerable <object> entities) { if (entities == null) { throw new ArgumentNullException(nameof(entities), $"{nameof(entities)} can not be null."); } var entityList = entities as List <object> ?? entities.ToList(); if (!entityList.Any()) { return; } // 1. Save 1-1 relationships first, as we'll need the ids of the related entities // for the main entities to be stored later. foreach (var navigationDatabaseAccess in this.NavigationDatabaseAccesses) { navigationDatabaseAccess.SaveBefore(entityList); } // 2. Use a batch manager to save the main entities using (var batchManager = this.CreateBatchManager()) { var valueProvider = new ClassValueProvider(this.Connector, entityList); while (valueProvider.MoveNext()) { using (var command = this.CommandBuilderManager.UpdateCommandBuilder.GetCommand(valueProvider)) { batchManager.Add(new CommandBatchStep(command)); } } batchManager.Execute(); } // 3. Save the 1-Many relationship at last, as they'll need the // main entity id before being stored. foreach (var navigationDatabaseAccess in this.NavigationDatabaseAccesses) { navigationDatabaseAccess.SaveAfter(entityList); } }
public void CorrectUpdateCommand(Type fixtureType, Type tableDescriptorType) { var fixture = Activator.CreateInstance(fixtureType) as CommandBuilderFixtureBase; var commandBuilderFactory = fixture.Connector.GetCommandBuilderFactory(); var tableDescription = new TableTypeDescriptor(tableDescriptorType); var entityToUpdate = fixture.Entity1; entityToUpdate.Name = "John Doe Junior"; entityToUpdate.Amount = 7200m; var valueProvider = new ClassValueProvider(fixture.Connector, new List <object> { entityToUpdate }); valueProvider.MoveNext(); using (var updateCommand = commandBuilderFactory.CreateUpdateCommandBuilder(tableDescription)) { var command = updateCommand.GetCommand(valueProvider); var parameters = command.Parameters.ToList(); command.CommandText.Should().Be(fixture.UpdateQuery); if (fixtureType == typeof(CqlCommandBuilderFixture)) { parameters.Should().HaveCount(5); parameters.Sort((x, y) => string.CompareOrdinal(x.ParameterName, y.ParameterName)); parameters[0].Value.Should().Be(7200m); parameters[2].Value.Should().Be(fixture.Entity1.Id); parameters[3].Value.Should().Be(fixture.Entity1.IsActive); parameters[4].Value.Should().Be("John Doe Junior"); } else { parameters.Should().HaveCount(5); parameters.Sort((x, y) => string.CompareOrdinal(x.ParameterName, y.ParameterName)); parameters[0].Value.Should().Be(7200m); parameters[1].Value.Should().Be(fixture.Entity1.CreatedDate); parameters[2].Value.Should().Be(fixture.Entity1.Id); parameters[3].Value.Should().Be(fixture.Entity1.IsActive); parameters[4].Value.Should().Be("John Doe Junior"); } } }
/// <summary> /// Deletes a list of objects from the table or view. /// </summary> /// <param name="entities">List of entities to delete.</param> /// <returns></returns> /// <exception cref="System.ArgumentException">entities can not be null.</exception> /// <remarks> /// This method utilizes batching to prevent unnecessary round trips to the database. /// </remarks> public virtual async Task DeleteAsync(IEnumerable <object> entities) { if (entities == null) { throw new ArgumentException(nameof(entities), $"{nameof(entities)} can not be null."); } var entityList = entities as List <object> ?? entities.ToList(); if (!entityList.Any()) { return; } // 1. Delete the children entities. foreach (var x in this.NavigationDatabaseAccesses) { await x.DeleteBeforeAsync(entityList); } // 2. Use a batch manager to save the main entities using (var batchManager = this.CreateBatchManager()) { var valueProvider = new ClassValueProvider(this.Connector, entityList); while (valueProvider.MoveNext()) { using (var command = this.CommandBuilderManager.DeleteCommandBuilder.GetCommand(valueProvider)) { batchManager.Add(new CommandBatchStep(command)); } } await batchManager.ExecuteAsync(); } // 3. Delete any parent entity if any. foreach (var x in this.NavigationDatabaseAccesses) { await x.DeleteAfterAsync(entityList); } }
public void ShouldInsertMultipleKeyData(Type fixtureType) { var fixture = Activator.CreateInstance(fixtureType) as CrudCommandFixtureBase; fixture.CreateDatabase(); fixture.CreateTables(); var insertCommandBuilder = fixture.Connector.GetCommandBuilderFactory().CreateInsertCommandBuilder(fixture.GetMultipleKeyDescriptor()); var entityToInsert = fixture.CreateNewTwoKeysEntity(); var valueProvider = new ClassValueProvider(fixture.Connector, new List <object> { entityToInsert }); valueProvider.MoveNext(); var insertCommand = insertCommandBuilder.GetCommand(valueProvider); insertCommand.ExecuteNonQuery(); fixture.DropDatabase(); }
public void ShouldCreateAnInsertCommand(Type fixtureType, Type tableDescriptorType) { var fixture = Activator.CreateInstance(fixtureType) as CommandBuilderFixtureBase; var commandBuilderFactory = fixture.Connector.GetCommandBuilderFactory(); var tableDescription = DescriptorCache.Instance.GetTableTypeDescriptor(tableDescriptorType); var valueProvider = new ClassValueProvider(fixture.Connector, new List <object> { fixture.Entity1 }); valueProvider.MoveNext(); var insertCommand = commandBuilderFactory.CreateInsertCommandBuilder(tableDescription); var command = insertCommand.GetCommand(valueProvider); var parameters = command.Parameters.ToList(); command.CommandText.Should().Be(fixture.InsertQuery); if (fixtureType == typeof(CqlCommandBuilderFixture)) { parameters.Should().HaveCount(5); parameters.Sort((x, y) => string.CompareOrdinal(x.ParameterName, y.ParameterName)); parameters[0].Value.Should().Be(3600m); parameters[3].Value.Should().Be(true); parameters[4].Value.Should().Be("John Doe"); } else { parameters.Should().HaveCount(4); parameters.Sort((x, y) => string.CompareOrdinal(x.ParameterName, y.ParameterName)); parameters[0].Value.Should().Be(3600m); parameters[1].Value.Should().Be(new DateTime(2017, 5, 23, 13, 55, 43, 0)); parameters[2].Value.Should().Be(true); parameters[3].Value.Should().Be("John Doe"); } }
public void ShouldUpdateData(Type fixtureType) { var fixture = Activator.CreateInstance(fixtureType) as CrudCommandFixtureBase; fixture.Should().NotBeNull(); fixture.CreateDatabase(); fixture.CreateParentTable(); fixture.CreateChildTable(); var first = fixture.CreateNewEntity(); var second = fixture.CreateNewEntity(); using (var insertCommandBuilder = fixture.Connector.GetCommandBuilderFactory().CreateInsertCommandBuilder(fixture.GetParentDescriptor())) { var valueProvider = new ClassValueProvider(fixture.Connector, new List <object> { first, second }); valueProvider.MoveNext(); insertCommandBuilder.GetCommand(valueProvider).ExecuteNonQuery(); valueProvider.MoveNext(); insertCommandBuilder.GetCommand(valueProvider).ExecuteNonQuery(); } using (var selectCommandBuilder = fixture.Connector.GetCommandBuilderFactory().CreateSelectCommandBuilder(fixture.GetParentDescriptor())) { var selectCommand = selectCommandBuilder.GetCommand(); using (var reader = selectCommand.ExecuteReader()) { var mapper = new DatabaseReaderMapper(fixture.Connector, fixture.GetParentDescriptor()); var results = mapper.Map(reader); first = results[0]; second = results[1]; } } using (var updateCommandBuilder = fixture.Connector.GetCommandBuilderFactory().CreateUpdateCommandBuilder(fixture.GetParentDescriptor())) { fixture.Update(first, second); var valueProvider = new ClassValueProvider(fixture.Connector, new List <object> { first, second }); updateCommandBuilder.Should().NotBeNull(); valueProvider.MoveNext(); var updateCommand = updateCommandBuilder.GetCommand(valueProvider); updateCommand.Should().NotBeNull(); updateCommand.CommandText.Should().Be(fixture.UpdateStatement); updateCommand.Invoking(c => c.ExecuteNonQuery()).ShouldNotThrow(); valueProvider.MoveNext(); updateCommand = updateCommandBuilder.GetCommand(valueProvider); updateCommand.Should().NotBeNull(); updateCommand.CommandText.Should().Be(fixture.UpdateStatement); updateCommand.Invoking(c => c.ExecuteNonQuery()).ShouldNotThrow(); } using (var selectCommandBuilder = fixture.Connector.GetCommandBuilderFactory().CreateSelectCommandBuilder(fixture.GetParentDescriptor())) { var selectCommand = selectCommandBuilder.GetCommand(); using (var reader = selectCommand.ExecuteReader()) { var mapper = new DatabaseReaderMapper(fixture.Connector, fixture.GetParentDescriptor()); var results = mapper.Map(reader); first = results[0]; second = results[1]; fixture.CheckUpdate(first, second); } } fixture.DropDatabase(); }
public void ShouldUpdateMultipleKeyData(Type fixtureType) { var fixture = Activator.CreateInstance(fixtureType) as CrudCommandFixtureBase; fixture.CreateDatabase(); fixture.CreateTables(); var first = fixture.CreateNewTwoKeysEntity(); var second = fixture.CreateNewTwoKeysEntity(); var insertCommandBuilder = fixture.Connector.GetCommandBuilderFactory().CreateInsertCommandBuilder(fixture.GetMultipleKeyDescriptor()); var valueProvider = new ClassValueProvider(fixture.Connector, new List <object> { first, second }); valueProvider.MoveNext(); insertCommandBuilder.GetCommand(valueProvider).ExecuteNonQuery(); valueProvider.MoveNext(); insertCommandBuilder.GetCommand(valueProvider).ExecuteNonQuery(); var selectCommandBuilder = fixture.Connector.GetCommandBuilderFactory().CreateSelectCommandBuilder(fixture.GetMultipleKeyDescriptor()); var selectCommand = selectCommandBuilder.GetCommand(); using (var reader = selectCommand.ExecuteReader()) { var mapper = new DatabaseReaderMapper(fixture.Connector, fixture.GetMultipleKeyDescriptor()); var results = mapper.Map(reader); first = results[0]; second = results[1]; } var updateCommandBuilder = fixture.Connector.GetCommandBuilderFactory().CreateUpdateCommandBuilder(fixture.GetMultipleKeyDescriptor()); valueProvider = new ClassValueProvider(fixture.Connector, new List <object> { first, second }); valueProvider.MoveNext(); var updateCommand = updateCommandBuilder.GetCommand(valueProvider); updateCommand.Invoking(c => c.ExecuteNonQuery()).Should().NotThrow(); valueProvider.MoveNext(); updateCommand = updateCommandBuilder.GetCommand(valueProvider); updateCommand.Invoking(c => c.ExecuteNonQuery()).Should().NotThrow(); selectCommandBuilder = fixture.Connector.GetCommandBuilderFactory().CreateSelectCommandBuilder(fixture.GetMultipleKeyDescriptor()); selectCommand = selectCommandBuilder.GetCommand(); using (var reader = selectCommand.ExecuteReader()) { var mapper = new DatabaseReaderMapper(fixture.Connector, fixture.GetMultipleKeyDescriptor()); var results = mapper.Map(reader); results.Should().NotBeNullOrEmpty(); } fixture.DropDatabase(); }