protected virtual void Generate(
            [NotNull] AlterSequenceOperation operation,
            [CanBeNull] IModel model,
            [NotNull] RelationalCommandListBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            builder
            .Append("ALTER SEQUENCE ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Name, operation.Schema));

            SequenceOptions(operation, model, builder);
        }
        protected virtual void Generate(
            [NotNull] AddPrimaryKeyOperation operation,
            [CanBeNull] IModel model,
            [NotNull] RelationalCommandListBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            builder
            .Append("ALTER TABLE ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Table, operation.Schema))
            .Append(" ADD ");
            PrimaryKeyConstraint(operation, model, builder);
        }
        private ResultSetMapping AppendSelectCommand(
            StringBuilder commandStringBuilder,
            IReadOnlyList <ColumnModification> readOperations,
            IReadOnlyList <ColumnModification> keyOperations,
            string insertedTableName,
            int insertedTableIndex,
            string tableName,
            string schema,
            string orderColumn = null)
        {
            commandStringBuilder
            .AppendLine()
            .Append("SELECT ")
            .AppendJoin(
                readOperations,
                SqlGenerationHelper,
                (sb, o, helper) => helper.DelimitIdentifier(sb, o.ColumnName, "t"))
            .Append(" FROM ");
            SqlGenerationHelper.DelimitIdentifier(commandStringBuilder, tableName, schema);
            commandStringBuilder
            .Append(" t")
            .AppendLine()
            .Append("INNER JOIN ")
            .Append(insertedTableName).Append(insertedTableIndex)
            .Append(" i")
            .Append(" ON ")
            .AppendJoin(
                keyOperations, (sb, c) =>
            {
                sb.Append("(");
                SqlGenerationHelper.DelimitIdentifier(sb, c.ColumnName, "t");
                sb.Append(" = ");
                SqlGenerationHelper.DelimitIdentifier(sb, c.ColumnName, "i");
                sb.Append(")");
            }, " AND ");

            if (orderColumn != null)
            {
                commandStringBuilder
                .AppendLine()
                .Append("ORDER BY ");
                SqlGenerationHelper.DelimitIdentifier(commandStringBuilder, orderColumn, "i");
            }

            commandStringBuilder
            .Append(SqlGenerationHelper.StatementTerminator).AppendLine()
            .AppendLine();

            return(ResultSetMapping.LastInResultSet);
        }
        /// <summary>
        ///     This API supports the Entity Framework Core infrastructure and is not intended to be used
        ///     directly from your code. This API may change or be removed in future releases.
        /// </summary>
        public override string GetDeleteScript(string migrationId)
        {
            Check.NotEmpty(migrationId, nameof(migrationId));

            return(new StringBuilder()
                   .Append("DELETE FROM ")
                   .AppendLine(SqlGenerationHelper.DelimitIdentifier(TableName, TableSchema))
                   .Append("WHERE ")
                   .Append(SqlGenerationHelper.DelimitIdentifier(MigrationIdColumnName))
                   .Append(" = N'")
                   .Append(SqlGenerationHelper.EscapeLiteral(migrationId))
                   .AppendLine("';")
                   .ToString());
        }
        protected override void Generate(RenameTableOperation operation, IModel model, RelationalCommandListBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            if (operation.NewName != null)
            {
                builder
                .Append("ALTER TABLE ")
                .Append(SqlGenerationHelper.DelimitIdentifier(operation.Name))
                .Append(" RENAME TO ")
                .Append(SqlGenerationHelper.DelimitIdentifier(operation.NewName));
            }
        }
        protected override void Generate([NotNull] DropForeignKeyOperation operation, [CanBeNull] IModel model, [NotNull] MigrationCommandListBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            builder
            .Append("ALTER TABLE ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Table, operation.Schema))
            .Append(" DROP FOREIGN KEY ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Name))
            .AppendLine(SqlGenerationHelper.StatementTerminator);

            EndStatement(builder);
        }
        protected override void Generate(
            DropIndexOperation operation,
            IModel model,
            RelationalCommandListBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            builder
            .Append("DROP INDEX ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Name))
            .Append(" ON ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Table, operation.Schema));
        }
        protected override void Generate(DropIndexOperation operation, IModel model, MigrationCommandListBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            builder
            .Append("ALTER TABLE ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Table, operation.Schema))
            .Append(" DROP INDEX ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Name))
            .AppendLine(SqlGenerationHelper.StatementTerminator);

            EndStatement(builder);
        }
        protected virtual void Generate(
            [NotNull] RestartSequenceOperation operation,
            [CanBeNull] IModel model,
            [NotNull] RelationalCommandListBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            builder
            .Append("ALTER SEQUENCE ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Name, operation.Schema))
            .Append(" RESTART WITH ")
            .Append(SqlGenerationHelper.GenerateLiteral(operation.StartValue));
        }
        protected virtual void Generate(
            [NotNull] DropUniqueConstraintOperation operation,
            [CanBeNull] IModel model,
            [NotNull] RelationalCommandListBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            builder
            .Append("ALTER TABLE ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Table, operation.Schema))
            .Append(" DROP CONSTRAINT ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Name));
        }
Пример #11
0
        /// <summary>
        /// 创建存储过程命令
        /// </summary>
        /// <returns></returns>
        protected override RawSqlCommand CreateStoreCommand()
        {
            try
            {
                if (Check.IsTraceEnabled(m_oracleLogger?.Logger))
                {
                    Trace <DbLoggerCategory.Update> .Write(m_oracleLogger, LogLevel.Trace, OracleTraceTag.Entry, OracleTraceClassName.OracleModificationCommandBatch, OracleTraceFuncName.CreateStoreCommand);
                }

                var commandText     = GetCommandText();
                var ommandBuilder   = _commandBuilderFactory.Create().Append(commandText);
                var parameterValues = new Dictionary <string, object>(GetParameterCount());

                foreach (ColumnModification item in ModificationCommands.SelectMany((ModificationCommand t) => t.ColumnModifications))
                {
                    if (item.UseCurrentValueParameter)
                    {
                        ommandBuilder.AddParameter(item.ParameterName, SqlGenerationHelper.GenerateParameterName(item.ParameterName), item.Property);
                        parameterValues.Add(item.ParameterName, item.Value);
                    }
                    if (item.UseOriginalValueParameter)
                    {
                        ommandBuilder.AddParameter(item.OriginalParameterName, SqlGenerationHelper.GenerateParameterName(item.OriginalParameterName), item.Property);
                        parameterValues.Add(item.OriginalParameterName, item.OriginalValue);
                    }
                }
                for (int i = 1; i < _cursorPosition; i++)
                {
                    var parameterName = $"cur{i}";
                    ommandBuilder.AddRawParameter(parameterName, (DbParameter) new OracleParameter(parameterName, OracleDbType.RefCursor, (object)DBNull.Value, ParameterDirection.Output));
                }
                return(new RawSqlCommand(ommandBuilder.Build(), parameterValues));
            }
            catch (Exception ex)
            {
                if (Check.IsErrorEnabled(m_oracleLogger?.Logger))
                {
                    Trace <DbLoggerCategory.Update> .Write(m_oracleLogger, LogLevel.Error, OracleTraceTag.Error, OracleTraceClassName.OracleModificationCommandBatch, OracleTraceFuncName.CreateStoreCommand, ex.ToString());
                }
                throw;
            }
            finally
            {
                if (Check.IsTraceEnabled(m_oracleLogger?.Logger))
                {
                    Trace <DbLoggerCategory.Update> .Write(m_oracleLogger, LogLevel.Trace, OracleTraceTag.Exit, OracleTraceClassName.OracleModificationCommandBatch, OracleTraceFuncName.CreateStoreCommand);
                }
            }
        }
        protected virtual void Generate(
            [NotNull] SqlServerCreateDatabaseOperation operation,
            [CanBeNull] IModel model,
            [NotNull] MigrationCommandListBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            builder
            .Append("CREATE DATABASE ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Name));

            if (!string.IsNullOrEmpty(operation.FileName))
            {
                var fileName = ExpandFileName(operation.FileName);
                var name     = Path.GetFileNameWithoutExtension(fileName);

                var logFileName = Path.ChangeExtension(fileName, ".ldf");
                var logName     = name + "_log";

                // Match default naming behavior of SQL Server
                logFileName = logFileName.Insert(logFileName.Length - ".ldf".Length, "_log");

                builder
                .AppendLine()
                .Append("ON (NAME = '")
                .Append(SqlGenerationHelper.EscapeLiteral(name))
                .Append("', FILENAME = '")
                .Append(SqlGenerationHelper.EscapeLiteral(fileName))
                .Append("')")
                .AppendLine()
                .Append("LOG ON (NAME = '")
                .Append(SqlGenerationHelper.EscapeLiteral(logName))
                .Append("', FILENAME = '")
                .Append(SqlGenerationHelper.EscapeLiteral(logFileName))
                .Append("')");
            }

            builder
            .AppendLine(SqlGenerationHelper.StatementTerminator)
            .EndCommand(suppressTransaction: true)
            .Append("IF SERVERPROPERTY('EngineEdition') <> 5 EXEC(N'ALTER DATABASE ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Name))
            .Append(" SET READ_COMMITTED_SNAPSHOT ON")
            .Append(SqlGenerationHelper.StatementTerminator)
            .Append("')")
            .AppendLine(SqlGenerationHelper.StatementTerminator)
            .EndCommand(suppressTransaction: true);
        }
        protected virtual void ColumnDefinition(
            [CanBeNull] string schema,
            [CanBeNull] string table,
            [NotNull] string name,
            [NotNull] Type clrType,
            [CanBeNull] string type,
            bool nullable,
            [CanBeNull] object defaultValue,
            [CanBeNull] string defaultValueSql,
            [CanBeNull] string computedColumnSql,
            bool identity,
            [NotNull] IAnnotatable annotatable,
            [CanBeNull] IModel model,
            [NotNull] RelationalCommandListBuilder builder)
        {
            Check.NotEmpty(name, nameof(name));
            Check.NotNull(clrType, nameof(clrType));
            Check.NotNull(annotatable, nameof(annotatable));
            Check.NotNull(builder, nameof(builder));

            if (computedColumnSql != null)
            {
                builder
                .Append(SqlGenerationHelper.DelimitIdentifier(name))
                .Append(" AS ")
                .Append(computedColumnSql);

                return;
            }

            base.ColumnDefinition(
                schema,
                table,
                name,
                clrType,
                type,
                nullable,
                defaultValue,
                defaultValueSql,
                computedColumnSql,
                annotatable,
                model,
                builder);

            if (identity)
            {
                builder.Append(" IDENTITY");
            }
        }
        protected virtual void Generate(
            [NotNull] CreateTableOperation operation,
            [CanBeNull] IModel model,
            [NotNull] RelationalCommandListBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            builder
            .Append("CREATE TABLE ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Name, operation.Schema))
            .AppendLine(" (");

            using (builder.Indent())
            {
                for (var i = 0; i < operation.Columns.Count; i++)
                {
                    var column = operation.Columns[i];
                    ColumnDefinition(column, model, builder);

                    if (i != operation.Columns.Count - 1)
                    {
                        builder.AppendLine(",");
                    }
                }

                if (operation.PrimaryKey != null)
                {
                    builder.AppendLine(",");
                    PrimaryKeyConstraint(operation.PrimaryKey, model, builder);
                }

                foreach (var uniqueConstraint in operation.UniqueConstraints)
                {
                    builder.AppendLine(",");
                    UniqueConstraint(uniqueConstraint, model, builder);
                }

                foreach (var foreignKey in operation.ForeignKeys)
                {
                    builder.AppendLine(",");
                    ForeignKeyConstraint(foreignKey, model, builder);
                }

                builder.AppendLine();
            }

            builder.Append(")");
        }
Пример #15
0
        protected override void Generate(
            DropForeignKeyOperation operation,
            IModel model,
            MigrationCommandListBuilder builder)
        {
            ThrowIf.Argument.IsNull(operation, "operation");
            ThrowIf.Argument.IsNull(builder, "builder");

            builder
            .Append("ALTER TABLE ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Table, operation.Schema))
            .Append(" DROP FOREIGN KEY ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Name))
            .AppendLine(SqlGenerationHelper.StatementTerminator);
        }
Пример #16
0
    /// <summary>
    ///     This is an internal API that supports the Entity Framework Core infrastructure and not subject to
    ///     the same compatibility standards as public APIs. It may be changed or removed without notice in
    ///     any release. You should only use it directly in your code with extreme caution and knowing that
    ///     doing so can result in application failures when updating to a new Entity Framework Core release.
    /// </summary>
    public override string GetBeginIfExistsScript(string migrationId)
    {
        var stringTypeMapping = Dependencies.TypeMappingSource.GetMapping(typeof(string));

        return(new StringBuilder()
               .Append("IF EXISTS(SELECT * FROM ")
               .Append(SqlGenerationHelper.DelimitIdentifier(TableName, TableSchema))
               .Append(" WHERE ")
               .Append(SqlGenerationHelper.DelimitIdentifier(MigrationIdColumnName))
               .Append(" = ")
               .Append(stringTypeMapping.GenerateSqlLiteral(migrationId))
               .AppendLine(")")
               .Append("BEGIN")
               .ToString());
    }
Пример #17
0
        public override string GetBeginIfNotExistsScript(string migrationId)
        {
            ThrowIf.Argument.IsNull(migrationId, "migrationId");

            return(new StringBuilder()
                   .Append("IF NOT EXISTS(SELECT * FROM ")
                   .Append(SqlGenerationHelper.DelimitIdentifier(TableName, TableSchema))
                   .Append(" WHERE ")
                   .Append(SqlGenerationHelper.DelimitIdentifier(MigrationIdColumnName))
                   .Append(" = '")
                   .Append(SqlGenerationHelper.EscapeLiteral(migrationId))
                   .AppendLine("')")
                   .Append("BEGIN")
                   .ToString());
        }
Пример #18
0
        /// <summary>
        ///     Generates a SQL script to delete a row from the history table.
        /// </summary>
        /// <param name="migrationId"> The migration identifier of the row to delete. </param>
        /// <returns> The generated SQL. </returns>
        public virtual string GetDeleteScript(string migrationId)
        {
            Check.NotEmpty(migrationId, nameof(migrationId));

            var stringTypeMapping = Dependencies.TypeMappingSource.GetMapping(typeof(string));

            return(new StringBuilder().Append("DELETE FROM ")
                   .AppendLine(SqlGenerationHelper.DelimitIdentifier(TableName, TableSchema))
                   .Append("WHERE ")
                   .Append(SqlGenerationHelper.DelimitIdentifier(MigrationIdColumnName))
                   .Append(" = ")
                   .Append(stringTypeMapping.GenerateSqlLiteral(migrationId))
                   .AppendLine(SqlGenerationHelper.StatementTerminator)
                   .ToString());
        }
Пример #19
0
        protected override void Generate(
            DropIndexOperation operation,
            IModel model,
            MigrationCommandListBuilder builder)
        {
            ThrowIf.Argument.IsNull(operation, "operation");
            ThrowIf.Argument.IsNull(builder, "builder");

            builder
            .Append("DROP INDEX ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Name))
            .Append(" ON ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Table, operation.Schema))
            .AppendLine(SqlGenerationHelper.StatementTerminator);
        }
Пример #20
0
        protected virtual void Generate(
            [NotNull] DropSequenceOperation operation,
            [CanBeNull] IModel model,
            [NotNull] MigrationCommandListBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            builder
            .Append("DROP SEQUENCE ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Name, operation.Schema))
            .AppendLine(SqlGenerationHelper.StatementTerminator);

            EndStatement(builder);
        }
        protected override void Generate(
            [NotNull] RenameColumnOperation operation,
            [CanBeNull] IModel model,
            [NotNull] MigrationCommandListBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            builder.Append("ALTER TABLE ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Table, operation.Schema))
            .Append(" RENAME COLUMN ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Name))
            .Append(" TO ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.NewName));
        }
        public override string GetBeginIfExistsScript(string migrationId)
        {
            Check.NotEmpty(migrationId, nameof(migrationId));

            return(new StringBuilder()
                   .Append("IF EXISTS(SELECT * FROM ")
                   .Append(SqlGenerationHelper.DelimitIdentifier(TableName, TableSchema))
                   .Append(" WHERE ")
                   .Append(SqlGenerationHelper.DelimitIdentifier(MigrationIdColumnName))
                   .Append(" = N'")
                   .Append(SqlGenerationHelper.EscapeLiteral(migrationId))
                   .AppendLine("')")
                   .Append("BEGIN")
                   .ToString());
        }
Пример #23
0
        protected virtual void Generate(
            [NotNull] AddUniqueConstraintOperation operation,
            [CanBeNull] IModel model,
            [NotNull] MigrationCommandListBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            builder
            .Append("ALTER TABLE ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Table, operation.Schema))
            .Append(" ADD ");
            UniqueConstraint(operation, model, builder);
            EndStatement(builder);
        }
Пример #24
0
 private void AppendInsertOutputClause(
     StringBuilder commandStringBuilder,
     string name,
     string schema,
     IReadOnlyList <ColumnModification> operations,
     IReadOnlyList <ColumnModification> allOperations)
 {
     if (allOperations.Count > 0 && allOperations[0] == operations[0])
     {
         commandStringBuilder
         .AppendLine($" RETURNING {SqlGenerationHelper.DelimitIdentifier(operations.First().ColumnName)} INTO :regAffeted;")
         .AppendLine("IF (ROW_COUNT > 0) THEN")
         .AppendLine("   SUSPEND;");
     }
 }
        protected override void Generate(AlterTableOperation operation, IModel model, MigrationCommandListBuilder builder)
        {
            var oldStorageParameters = GetStorageParameters(operation.OldTable);
            var newStorageParameters = GetStorageParameters(operation);

            var newOrChanged = newStorageParameters.Where(p =>
                                                          !oldStorageParameters.ContainsKey(p.Key) ||
                                                          oldStorageParameters[p.Key] != p.Value
                                                          ).ToList();

            if (newOrChanged.Count > 0)
            {
                builder
                .Append("ALTER TABLE ")
                .Append(SqlGenerationHelper.DelimitIdentifier(operation.Name, operation.Schema));

                builder
                .Append(" SET (")
                .Append(string.Join(", ", newOrChanged.Select(p => $"{p.Key}={p.Value}")))
                .Append(")");

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

            var removed = oldStorageParameters
                          .Select(p => p.Key)
                          .Where(pn => !newStorageParameters.ContainsKey(pn))
                          .ToList();

            if (removed.Count > 0)
            {
                builder
                .Append("ALTER TABLE ")
                .Append(SqlGenerationHelper.DelimitIdentifier(operation.Name, operation.Schema));

                builder
                .Append(" RESET (")
                .Append(string.Join(", ", removed))
                .Append(")");

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


            base.Generate(operation, model, builder);
        }
 private void AppendReturnInsert(StringBuilder commandStringBuilder, string name, IReadOnlyList <ColumnModification> operations, int commandPosition)
 {
     if (operations.Count > 0)
     {
         commandStringBuilder.AppendLine().Append("RETURNING ").AppendJoin(operations, delegate(StringBuilder sb, ColumnModification cm)
         {
             sb.Append(SqlGenerationHelper.DelimitIdentifier(cm.ColumnName));
         })
         .Append(" INTO ")
         .AppendJoin(operations, delegate(StringBuilder sb, ColumnModification cm)
         {
             sb.Append($"l{name}({commandPosition + 1}).{SqlGenerationHelper.DelimitIdentifier(cm.ColumnName)}");
         });
     }
     commandStringBuilder.AppendLine(SqlGenerationHelper.StatementTerminator);
 }
Пример #27
0
        protected virtual void Generate(
            [NotNull] DropPrimaryKeyOperation operation,
            [CanBeNull] IModel model,
            [NotNull] MigrationCommandListBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            builder
            .Append("ALTER TABLE ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Table, operation.Schema))
            .Append(" DROP CONSTRAINT ")
            .Append(SqlGenerationHelper.DelimitIdentifier(operation.Name));

            EndStatement(builder);
        }
        /// <summary>
        ///     This API supports the Entity Framework Core infrastructure and is not intended to be used
        ///     directly from your code. This API may change or be removed in future releases.
        /// </summary>
        public override string GetCreateIfNotExistsScript()
        {
            var builder = new IndentedStringBuilder();

            builder
            .Append("IF NOT EXISTS (SELECT * FROM (SHOW TABLES) WHERE Name = '")
            .Append(SqlGenerationHelper.EscapeLiteral(TableName))
            .Append("') THEN ");
            using (builder.Indent())
            {
                builder.AppendLines(GetCreateScript());
            }
            builder.AppendLine(";");

            return(builder.ToString());
        }
        protected virtual void Transfer(
            [NotNull] string newSchema,
            [CanBeNull] string schema,
            [NotNull] string name,
            [NotNull] RelationalCommandListBuilder builder)
        {
            Check.NotEmpty(newSchema, nameof(newSchema));
            Check.NotEmpty(name, nameof(name));
            Check.NotNull(builder, nameof(builder));

            builder
            .Append("ALTER SCHEMA ")
            .Append(SqlGenerationHelper.DelimitIdentifier(newSchema))
            .Append(" TRANSFER ")
            .Append(SqlGenerationHelper.DelimitIdentifier(name, schema));
        }
Пример #30
0
        protected override void AppendIdentityWhereCondition(StringBuilder builder, ColumnModification columnModification)
        {
            Check.NotNull(builder, nameof(builder));
            Check.NotNull(columnModification, nameof(columnModification));

            var castAs = columnModification.Property.ClrType == typeof(int)
                ? "int"
                : "bigint";

            builder
            .Append(SqlGenerationHelper.DelimitIdentifier(columnModification.ColumnName))
            .Append(" = ")
            .Append("CAST (@@IDENTITY AS ")
            .Append(castAs)
            .Append(")");
        }