private async Task BulkCopyAsync <TEntity>( IEnumerable <TEntity> items, string destinationTableName, IDictionary <string, string> columnMappings, bool useTableLock, CancellationToken cancellationToken) where TEntity : class { var options = SqlBulkCopyOptions.KeepNulls; if (useTableLock) { options &= SqlBulkCopyOptions.TableLock; } using (var sqlBulkCopy = new SqlBulkCopy(connection, options, externalTransaction: null)) { sqlBulkCopy.BulkCopyTimeout = 0; sqlBulkCopy.DestinationTableName = destinationTableName; foreach (var columnMapping in columnMappings) { sqlBulkCopy.ColumnMappings.Add(columnMapping.Key, columnMapping.Value); } using (var reader = new TypedDataReader <TEntity>(columnMappings, items)) { await sqlBulkCopy.WriteToServerAsync(reader, cancellationToken).ConfigureAwait(false); } } }