public RuntimeContext(IDbConnection connection, IDbTransaction transaction, IDbCommandExecutor executor, IProviderMetadata providerMetadata, IMigrationStepMetadata stepMetadata) : base(providerMetadata, stepMetadata) { _connection = connection; _transaction = transaction; _executor = executor; }
/// <summary> /// Helper method that runs ADO.NET test suite for the specified <see cref="IDbCommandExecutor"/> /// in addition to other built-in implementations. /// </summary> /// <param name="connection">The <see cref="IDbConnection"/> to use to connect to the database.</param> /// <param name="commandFactory">A <see cref="DbCommandFactory"/> implementation specific to an ADO.NET provider, e.g. SqlCommand, NpgsqlCommand.</param> /// <param name="providerSpecificCommandExecutor">A <see cref="IDbCommandExecutor"/> specific to an ADO.NET provider, e.g. SqlCommand, NpgsqlCommand, used to call DbCommand methods.</param> /// <param name="cancellationToken">A cancellation token passed into downstream async methods.</param> /// <returns>A task representing the asynchronous operation.</returns> public static async Task RunAllAsync( IDbConnection connection, DbCommandFactory commandFactory, IDbCommandExecutor providerSpecificCommandExecutor, CancellationToken cancellationToken) { var executors = new List <IDbCommandExecutor> { // call methods directly like SqlCommand.ExecuteScalar(), provided by caller providerSpecificCommandExecutor, // call methods through DbCommand reference new DbCommandClassExecutor(), // call methods through IDbCommand reference new DbCommandInterfaceExecutor(), #if !NET45 // call methods through DbCommand reference (referencing netstandard.dll) new DbCommandNetStandardClassExecutor(), // call methods through IDbCommand reference (referencing netstandard.dll) new DbCommandNetStandardInterfaceExecutor(), #endif }; using (var root = Tracer.Instance.StartActive("root")) { foreach (var executor in executors) { await RunAsync(connection, commandFactory, executor, cancellationToken); } } }
public static List <T> ExecuteReader <T>(this IDbCommandExecutor executor, ExecuteReaderRequest request, Func <IDataRecord, T> read) { List <T> rows = null; executor.ExecuteReader(request, dataReader => rows = dataReader.ReadResult(() => read(dataReader))); return(rows); }
public static int ExecuteNonQuery(this IDbCommandExecutor executor, CreateCommandRequest request) { var affectedRows = 0; executor.Execute(request, command => affectedRows = command.ExecuteNonQuery()); return(affectedRows); }
internal void Execute(IDbConnection connection, IDbTransaction transaction, MigrationDirection direction, IDbCommandExecutor commandExecutor) { Debug.Assert(connection.State == ConnectionState.Open); var context = new RuntimeContext(connection, transaction, commandExecutor, _providerMetadata); Database database = GetDatabaseContainingMigrationChanges(direction, context); var translator = new CommandsToSqlTranslator(_provider); foreach (string commandText in translator.TranslateToSql(database, context)) { //MigSharp uses ADO, not SMO to run SQL. ADO does not support the 'GO' statement in SQL as it is not TSQL. //We split SQL on 'GO' and run as individual statements var separatedByGoStatements = new List<string>(goStatementRegex.Split(commandText)); separatedByGoStatements.RemoveAll(r => String.IsNullOrEmpty(r.Trim())); foreach (var statement in separatedByGoStatements) { IDbCommand command = connection.CreateCommand(); command.CommandTimeout = 0; // do not timeout; the client is responsible for not causing lock-outs command.Transaction = transaction; command.CommandText = statement; try { commandExecutor.ExecuteNonQuery(command); } catch (DbException x) { Log.Error("An error occurred: {0}{1}while trying to execute:{1}{2}", x.Message, Environment.NewLine, command.CommandText); throw; } } } }
/// <summary> /// Creates a RunAllAsync<TDbCommand> transaction with the following spans, /// when the profiler is attached: /// <para/> /// nameof(TDbCommand) command span: /// <list type="bullet"> /// <item>sync span + 7 command spans</item> /// <item>async span + 7 command spans (if supports async)</item> /// <item>async with cancellation span + 7 command spans (if supports async)</item> /// </list> /// 25 spans (if supports async), otherwise 9 spans /// /// <para/> /// DbCommand command span: /// <list type="bullet"> /// <item>sync span + 7 command spans</item> /// <item>async span + 7 command spans</item> /// <item>async with cancellation span + 7 command spans</item> /// </list> /// 25 spans /// /// <para /> /// IDbCommand command span: /// <list type="bullet"> /// <item>sync span + 7 command spans</item> /// </list> /// 9 spans /// /// <para /> /// IDbCommandGenericConstraint<TDbCommand> command span: /// <list type="bullet"> /// <item>sync span + 7 command spans</item> /// </list> /// 9 spans /// /// <para/> /// DbCommand-NetStandard command span: /// <list type="bullet"> /// <item>sync span + 7 command spans</item> /// <item>async span + 7 command spans</item> /// <item>async with cancellation span + 7 command spans</item> /// </list> /// 25 spans /// /// <para /> /// IDbCommand-NetStandard command span: /// <list type="bullet"> /// <item>sync span + 7 command spans</item> /// </list> /// 9 spans /// /// <para /> /// IDbCommandGenericConstraint<TDbCommand>-NetStandard command span: /// <list type="bullet"> /// <item>sync span + 7 command spans</item> /// </list> /// 9 spans /// /// <para /> /// 111 spans total (if supports async), otherwise 95 spans /// </summary> public static async Task RunAllAsync <TDbCommand>( DbCommandFactory commandFactory, IDbCommandExecutor providerCommandExecutor, CancellationToken token ) where TDbCommand : IDbCommand { var executors = new List <IDbCommandExecutor> { providerCommandExecutor, new DbCommandClassExecutor(), new DbCommandInterfaceExecutor(), new DbCommandInterfaceGenericExecutor <TDbCommand>(), // call methods referencing netstandard.dll new DbCommandNetStandardClassExecutor(), new DbCommandNetStandardInterfaceExecutor(), new DbCommandNetStandardInterfaceGenericExecutor <TDbCommand>(), }; await Agent.Tracer.CaptureTransaction("RunAllAsync<TDbCommand>", "test", async transaction => { foreach (var executor in executors) { await RunAsync(transaction, commandFactory, executor, token); } }); }
public static void Execute(this IDbCommandExecutor executor, CreateCommandRequest request, Action <IDbCommand> execute) { ArgumentNullException.ThrowIfNull(executor); var requests = new ExecuteCommandRequest(request, execute).ItemToArray(); executor.Execute(requests); }
public static DataSet ExecuteDataSet(this IDbCommandExecutor executor, ExecuteReaderRequest request) { DataSet dataSet = null; executor.Execute(request.CreateCommandRequest, command => { dataSet = command.ExecuteDataSet(request.CancellationToken); }); return(dataSet); }
public static void Execute(this IDbCommandExecutor executor, CreateCommandRequest request, Action <IDbCommand> execute) { Assert.IsNotNull(executor); var requests = new ExecuteCommandRequest(request, execute).ItemToArray(); executor.Execute(requests); }
public static object ExecuteScalar(this IDbCommandExecutor executor, CreateCommandRequest request) { object scalar = null; executor.Execute(request, command => scalar = command.ExecuteScalar()); return(scalar); }
public static object ExecuteScalar(this IDbCommandExecutor executor, CreateCommandRequest request) { ArgumentNullException.ThrowIfNull(executor); object scalar = null; executor.Execute(request, command => scalar = command.ExecuteScalar()); return(scalar); }
internal void UpdateToInclude(IEnumerable<IMigrationMetadata> containedMigrations, IDbConnection connection, IDbTransaction transaction, IDbCommandExecutor executor) { foreach (IMigrationMetadata metadata in containedMigrations) { _history.Insert(metadata.Timestamp, metadata.ModuleName, metadata.Tag); } StoreChanges(connection, transaction, executor); }
public static void ExecuteReader(this IDbCommandExecutor executor, ExecuteReaderRequest request, Action <IDataReader> read) { executor.Execute(request.CreateCommandRequest, command => { using (var dataReader = command.ExecuteReader(request.CommandBehavior)) read(dataReader); }); }
public static ExecuteReaderResponse <T1, T2> ExecuteReader <T1, T2>(this IDbCommandExecutor executor, ExecuteReaderRequest request, Func <IDataRecord, T1> read1, Func <IDataRecord, T2> read2) { ExecuteReaderResponse <T1, T2> response = null; executor.ExecuteReader(request, dataReader => response = dataReader.Read(() => read1(dataReader), () => read2(dataReader))); return(response); }
public static int ExecuteNonQuery(this IDbCommandExecutor executor, CreateCommandRequest request) { ArgumentNullException.ThrowIfNull(executor); var affectedRows = 0; executor.Execute(request, command => affectedRows = command.ExecuteNonQuery()); return(affectedRows); }
public static DataSet ExecuteDataSet(this IDbCommandExecutor executor, ExecuteReaderRequest request) { ArgumentNullException.ThrowIfNull(executor); ArgumentNullException.ThrowIfNull(request); DataSet dataSet = null; executor.Execute(request.CreateCommandRequest, command => { dataSet = command.ExecuteDataSet(request.CancellationToken); }); return(dataSet); }
public SqlQueryExecutor( ISqlGenerator sqlGenerator, IDbCommandExecutor dbCommandExecutor, IEntityMapper entityMapper) { _sqlGenerator = sqlGenerator; _dbCommandExecutor = dbCommandExecutor; _entityMapper = entityMapper; }
public static ReadOnlySegmentLinkedList <T> ExecuteReader <T>(this IDbCommandExecutor executor, ExecuteReaderRequest request, int segmentLength, Func <IDataRecord, T> readRecord) { Assert.IsNotNull(executor); ReadOnlySegmentLinkedList <T> rows = null; executor.ExecuteReader(request, dataReader => rows = dataReader.ReadResult(segmentLength, readRecord)); return(rows); }
public static void Execute(this IDbCommandExecutor executor, CreateCommandRequest request, Action <IDbCommand> execute) { var requests = new[] { new ExecuteCommandRequest(request, execute) }; executor.Execute(requests); }
public static object GetResultSync(this IDbCommandExecutor executor, DbCommandWrapper command) { executor.Execute(command).Wait(); if (command.Ok) { return(command.Result); } throw command.Error; }
public static void ExecuteReader(this IDbCommandExecutor executor, ExecuteReaderRequest request, Action <IDataReader> readResults) { Assert.IsNotNull(executor); Assert.IsNotNull(request); executor.Execute(request.CreateCommandRequest, command => { using (var dataReader = command.ExecuteReader(request.CommandBehavior)) readResults(dataReader); }); }
private static void Execute(this IDbCommandExecutor executor, IEnumerable <ExecuteCommandRequest> requests) { executor.Execute(connection => { foreach (var request in requests) { using (var command = connection.CreateCommand(request.CreateCommandRequest)) request.Execute(command); } }); }
private static void Execute(this IDbCommandExecutor executor, IEnumerable <ExecuteCommandRequest> requests) { ArgumentNullException.ThrowIfNull(executor); executor.Execute(connection => { foreach (var request in requests) { using (var command = connection.CreateCommand(request.CreateCommandRequest)) request.Execute(command); } }); }
public SequenceIdentityGenerator( [NotNull] IDbCommandExecutor commandExecutor, int increment, SchemaQualifiedName sequenceName) { Check.NotNull(commandExecutor, "commandExecutor"); _commandExecutor = commandExecutor; _increment = increment; _sequenceName = sequenceName; _selectNextValueSql = string.Format( CultureInfo.InvariantCulture, "SELECT NEXT VALUE FOR {0}", new SqlServerMigrationOperationSqlGenerator(new SqlServerTypeMapper()).DelimitIdentifier(_sequenceName)); }
public void Update(IScheduledMigrationMetadata metadata, IDbConnection connection, IDbTransaction transaction, IDbCommandExecutor commandExecutor) { Debug.Assert(!(metadata is BootstrapMetadata)); if (metadata.Direction == MigrationDirection.Up) { _history.Insert(metadata.Timestamp, metadata.ModuleName, metadata.Tag); } else { Debug.Assert(metadata.Direction == MigrationDirection.Down); _history.Delete(metadata.Timestamp, metadata.ModuleName); } StoreChanges(connection, transaction, commandExecutor); }
public void Store(IDbConnection connection, IDbTransaction transaction, IDbCommandExecutor executor) { Debug.Assert(connection.State == ConnectionState.Open); DateTime start = DateTime.Now; foreach (IMigrationMetadata entry in _entriesToDelete) { IDbCommand command = connection.CreateCommand(); command.Transaction = transaction; string moduleName = entry.ModuleName; IDataParameter moduleNameParameter = command.AddParameter("@ModuleName", DbType.String, moduleName); long timestamp = entry.Timestamp; command.CommandText = string.Format(CultureInfo.InvariantCulture, "DELETE FROM \"{0}\" WHERE \"{1}\" = {2} AND \"{3}\" = {4}", _tableName, BootstrapMigration.TimestampColumnName, timestamp.ToString(CultureInfo.InvariantCulture), BootstrapMigration.ModuleColumnName, _providerMetadata.GetParameterSpecifier(moduleNameParameter)); // note: we do not provide the timestamp as a parameter as the OracleOdbcProvider has an issue with it executor.ExecuteNonQuery(command); Predicate <IMigrationMetadata> match = m => m.Timestamp == timestamp && m.ModuleName == moduleName; Debug.Assert(_actualEntries.FindAll(match).Count == 1, "There should be one existing entry if it is deleted."); _actualEntries.RemoveAll(match); } _entriesToDelete.Clear(); foreach (IMigrationMetadata entry in _entriesToInsert) { IDbCommand command = connection.CreateCommand(); command.Transaction = transaction; IDataParameter moduleNameParameter = command.AddParameter("@ModuleName", DbType.String, entry.ModuleName); IDataParameter tagParameter = command.AddParameter("@Tag", DbType.String, !string.IsNullOrEmpty(entry.Tag) ? (object)entry.Tag : DBNull.Value); command.CommandText = string.Format(CultureInfo.InvariantCulture, @"INSERT INTO ""{0}"" (""{1}"", ""{2}"", ""{3}"") VALUES ({4}, {5}, {6})", _tableName, BootstrapMigration.TimestampColumnName, BootstrapMigration.ModuleColumnName, BootstrapMigration.TagColumnName, entry.Timestamp.ToString(CultureInfo.InvariantCulture), _providerMetadata.GetParameterSpecifier(moduleNameParameter), _providerMetadata.GetParameterSpecifier(tagParameter)); // note: we do not provide the timestamp as a parameter as the OracleOdbcProvider has an issue with it executor.ExecuteNonQuery(command); _actualEntries.Add(entry); } _entriesToInsert.Clear(); Log.Verbose(LogCategory.Performance, "Version update took {0}s", (DateTime.Now - start).TotalSeconds); }
public void Store(IDbConnection connection, IDbTransaction transaction, IDbCommandExecutor executor) { Debug.Assert(connection.State == ConnectionState.Open); DateTime start = DateTime.Now; foreach (IMigrationMetadata entry in _entriesToDelete) { IDbCommand command = connection.CreateCommand(); command.Transaction = transaction; string moduleName = entry.ModuleName; IDataParameter moduleNameParameter = command.AddParameter("@ModuleName", DbType.String, moduleName); long timestamp = entry.Timestamp; command.CommandText = string.Format(CultureInfo.InvariantCulture, "DELETE FROM {0} WHERE {1} = {2} AND {3} = {4}", _tableName, BootstrapMigration.TimestampColumnName, timestamp.ToString(CultureInfo.InvariantCulture), BootstrapMigration.ModuleColumnName, _providerMetadata.GetParameterSpecifier(moduleNameParameter)); // note: we do not provide the timestamp as a parameter as the OracleOdbcProvider has an issue with it executor.ExecuteNonQuery(command); Predicate<IMigrationMetadata> match = m => m.Timestamp == timestamp && m.ModuleName == moduleName; Debug.Assert(_actualEntries.FindAll(match).Count == 1, "There should be one existing entry if it is deleted."); _actualEntries.RemoveAll(match); } _entriesToDelete.Clear(); foreach (IMigrationMetadata entry in _entriesToInsert) { IDbCommand command = connection.CreateCommand(); command.Transaction = transaction; IDataParameter moduleNameParameter = command.AddParameter("@ModuleName", DbType.String, entry.ModuleName); IDataParameter tagParameter = command.AddParameter("@Tag", DbType.String, !string.IsNullOrEmpty(entry.Tag) ? (object)entry.Tag : DBNull.Value); command.CommandText = string.Format(CultureInfo.InvariantCulture, @"INSERT INTO {0} ({1}, {2}, {3}) VALUES ({4}, {5}, {6})", _tableName, BootstrapMigration.TimestampColumnName, BootstrapMigration.ModuleColumnName, BootstrapMigration.TagColumnName, entry.Timestamp.ToString(CultureInfo.InvariantCulture), _providerMetadata.GetParameterSpecifier(moduleNameParameter), _providerMetadata.GetParameterSpecifier(tagParameter)); // note: we do not provide the timestamp as a parameter as the OracleOdbcProvider has an issue with it executor.ExecuteNonQuery(command); _actualEntries.Add(entry); } _entriesToInsert.Clear(); Log.Verbose(LogCategory.Performance, "Version update took {0}s", (DateTime.Now - start).TotalSeconds); }
public void Update(IMigrationMetadata metadata, IDbConnection connection, IDbTransaction transaction, MigrationDirection direction, IDbCommandExecutor commandExecutor) { Debug.Assert(!(metadata is BootstrapMetadata)); if (direction == MigrationDirection.Up) { _history.Insert(metadata.Timestamp, metadata.ModuleName, metadata.Tag); } else { Debug.Assert(direction == MigrationDirection.Down); Debug.Assert(_history.Contains(metadata.Timestamp, metadata.ModuleName), "Only migrations that were applied previously are being undone."); _history.Delete(metadata.Timestamp, metadata.ModuleName); } StoreChanges(connection, transaction, commandExecutor); }
public void Update(IMigrationStepMetadata metadata, IDbConnection connection, IDbTransaction transaction, IDbCommandExecutor commandExecutor) { foreach (IMigrationMetadata migrationMetadata in metadata.Migrations) { Debug.Assert(migrationMetadata.ModuleName == metadata.ModuleName, "The migration module name must correspond to the module name of the scheduled migration step."); if (metadata.Direction == MigrationDirection.Up) { _history.Insert(migrationMetadata.Timestamp, metadata.ModuleName, migrationMetadata.Tag); } else { Debug.Assert(metadata.Direction == MigrationDirection.Down); _history.Delete(migrationMetadata.Timestamp, metadata.ModuleName); } } StoreChanges(connection, transaction, commandExecutor); }
public void Store(IDbConnection connection, IDbTransaction transaction, IDbCommandExecutor executor) { Debug.Assert(connection.State == ConnectionState.Open); DateTime start = DateTime.Now; foreach (HistoryEntryId entryId in _entriesToDelete) { IDbCommand command = connection.CreateCommand(); command.Transaction = transaction; IDataParameter moduleNameParameter = command.AddParameter("@ModuleName", DbType.String, entryId.ModuleName); command.CommandText = string.Format(CultureInfo.InvariantCulture, "DELETE FROM \"{0}\" WHERE \"{1}\" = {2} AND \"{3}\" = {4}", _tableName, BootstrapMigration.TimestampColumnName, entryId.Timestamp.ToString(CultureInfo.InvariantCulture), BootstrapMigration.ModuleColumnName, _providerMetadata.GetParameterSpecifier(moduleNameParameter)); // note: we do not provide the timestamp as a parameter as the OracleOdbcProvider has an issue with it executor.ExecuteNonQuery(command); RemoveFromActualEntries(entryId); } _entriesToDelete.Clear(); foreach (HistoryEntry entry in _entriesToInsert) { IDbCommand command = connection.CreateCommand(); command.Transaction = transaction; IDataParameter moduleNameParameter = command.AddParameter("@ModuleName", DbType.String, entry.ModuleName); IDataParameter tagParameter = command.AddParameter("@Tag", DbType.String, !string.IsNullOrEmpty(entry.Tag) ? (object)entry.Tag : DBNull.Value); command.CommandText = string.Format(CultureInfo.InvariantCulture, @"INSERT INTO ""{0}"" (""{1}"", ""{2}"", ""{3}"") VALUES ({4}, {5}, {6})", _tableName, BootstrapMigration.TimestampColumnName, BootstrapMigration.ModuleColumnName, BootstrapMigration.TagColumnName, entry.Timestamp.ToString(CultureInfo.InvariantCulture), _providerMetadata.GetParameterSpecifier(moduleNameParameter), _providerMetadata.GetParameterSpecifier(tagParameter)); // note: we do not provide the timestamp as a parameter as the OracleOdbcProvider has an issue with it executor.ExecuteNonQuery(command); AddToActualEntries(entry); } _entriesToInsert.Clear(); Log.Verbose(LogCategory.Performance, "Version update took {0}s", (DateTime.Now - start).TotalSeconds); }
internal void Execute(IDbConnection connection, IDbTransaction transaction, MigrationDirection direction, IDbCommandExecutor commandExecutor) { Debug.Assert(connection.State == ConnectionState.Open); var context = new RuntimeContext(connection, transaction, commandExecutor, _providerMetadata); Database database = GetDatabaseContainingMigrationChanges(direction, context); var translator = new CommandsToSqlTranslator(_provider); foreach (string commandText in translator.TranslateToSql(database, context)) { IDbCommand command = connection.CreateCommand(); command.CommandTimeout = 0; // do not timeout; the client is responsible for not causing lock-outs command.Transaction = transaction; command.CommandText = commandText; try { commandExecutor.ExecuteNonQuery(command); } catch (DbException x) { Log.Error("An error occurred: {0}{1}while trying to execute:{1}{2}{1}{3}", x.Message, Environment.NewLine, command.CommandText,_migration.GetType().ToString()); throw new Exception(String.Format("An error occurred: {0}{1}while trying to execute:{1}{2}{1}Migration: {3}", x.Message, Environment.NewLine, command.CommandText, _migration.GetType())); } } }
public void Update(IMigrationStepMetadata metadata, IDbConnection connection, IDbTransaction transaction, IDbCommandExecutor commandExecutor) { PersistedVersioning versioning = GetPersistedVersioning(connection, transaction, commandExecutor); versioning.Update(metadata, connection, transaction, commandExecutor); }
private PersistedVersioning GetPersistedVersioning(IDbConnection connection, IDbTransaction transaction, IDbCommandExecutor executor) { if (_persistedVersioning == null) { var history = new History(_versioningTableName, _providerMetadata); if (!_versioningTableExists.Value) { Debug.Assert(connection != null, "At this point, an upgrade of the versioning table is requested. This always takes part of a running migration step and therefore already has an associated connection (and possibly a transaction)."); // execute the boostrap migration to create the versioning table var step = new BootstrapMigrationStep(new BootstrapMigration(_versioningTableName), _provider, _providerMetadata); step.Execute(connection, transaction, MigrationDirection.Up, executor); _versioningTableExists = new Lazy <bool>(() => true); // now, the versioning table exists } else { // load the existing entries from the versioning table IDbConnection c = connection ?? _connectionFactory.OpenConnection(_connectionInfo); try { history.Load(c, transaction); } finally { if (connection == null) // we had to open a connection ourselves { c.Dispose(); } } } _persistedVersioning = new PersistedVersioning(history); } Debug.Assert(_persistedVersioning != null); return(_persistedVersioning); }
private PersistedVersioning GetPersistedVersioning(IDbConnection connection, IDbTransaction transaction, IDbCommandExecutor executor) { if (_persistedVersioning == null) { var history = new History(_versioningTableName, _configuration.ProviderInfo.Metadata); if (!_versioningTableExists.Value) { Debug.Assert(connection != null, "At this point, an upgrade of the versioning table is requested. This always takes part of a running migration step and therefore already has an associated connection (and possibly a transaction)."); // execute the boostrap migration to create the versioning table var step = new BootstrapMigrationStep(new BootstrapMigration(_versioningTableName), null); step.Execute(_configuration.ProviderInfo, connection, transaction, MigrationDirection.Up, executor); _versioningTableExists = new Lazy<bool>(() => true); // now, the versioning table exists } else { // load the existing entries from the versioning table IDbConnection c = connection ?? _configuration.OpenConnection(); try { history.Load(c, transaction); } finally { if (connection == null) // we had to open a connection ourselves { c.Dispose(); } } } _persistedVersioning = new PersistedVersioning(history); } Debug.Assert(_persistedVersioning != null); return _persistedVersioning; }
private void StoreChanges(IDbConnection connection, IDbTransaction transaction, IDbCommandExecutor executor) { _history.Store(connection, transaction, executor); }
public ObjectCountExecutor(ISqlGenerator sqlGenerator, IConventionReader conventionReader, IDbCommandExecutor dbCommandExecutor) { _sqlGenerator = sqlGenerator; _conventionReader = conventionReader; _dbCommandExecutor = dbCommandExecutor; }
public void Update(IScheduledMigrationMetadata metadata, IDbConnection connection, IDbTransaction transaction, IDbCommandExecutor commandExecutor) { // nothing to do }