public virtual OperationBuilder <DeleteDataOperation> DeleteData(
            [NotNull] string table,
            [NotNull] string[] keyColumns,
            [NotNull] object[,] keyValues,
            [CanBeNull] string schema = null)
        {
            Check.NotEmpty(table, nameof(table));
            Check.NotNull(keyColumns, nameof(keyColumns));
            Check.NotNull(keyValues, nameof(keyValues));

            var operation = new DeleteDataOperation
            {
                Table      = table,
                Schema     = schema,
                KeyColumns = keyColumns,
                KeyValues  = keyValues
            };

            Operations.Add(operation);

            return(new OperationBuilder <DeleteDataOperation>(operation));
        }
        protected virtual void Generate(
            [NotNull] DeleteDataOperation operation,
            [CanBeNull] IModel model,
            [NotNull] MigrationCommandListBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            if (operation.KeyValues.Length == 0)
            {
                return;
            }

            builder
            .Append("DELETE FROM ")
            .AppendLine(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Table, operation.Schema));

            builder.Append("WHERE ");

            var rowCount   = operation.KeyValues.GetLength(0);
            var valueCount = operation.KeyValues.GetLength(1);

            for (var i = 0; i < rowCount; i++)
            {
                if (i != 0)
                {
                    builder
                    .AppendLine(" OR")
                    .Append("      ");
                }

                builder.Append("(");
                for (var j = 0; j < valueCount; j++)
                {
                    if (j != 0)
                    {
                        builder.Append(" AND ");
                    }

                    builder.Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.KeyColumns[j]));

                    var value = operation.KeyValues[i, j];
                    if (value == null)
                    {
                        builder.Append(" IS NULL");
                    }
                    else
                    {
                        var typeMapping = Dependencies.TypeMapper.GetMappingForValue(value);
                        builder
                        .Append(" = ")
                        .Append(typeMapping.GenerateSqlLiteral(value));
                    }
                }

                builder.Append(")");
            }

            builder.AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator);
            EndStatement(builder);
        }