Exemple #1
0
        public void Visit_with_alter_column_operation_drops_default_constraint()
        {
            var modelBuilder = new BasicModelBuilder();

            modelBuilder.Entity("A",
                                b =>
            {
                b.Property <int>("Id");
                b.Property <string>("P").ForSqlServer().DefaultExpression("abc");
                b.Key("Id");
            });

            var alterColumnOperation
                = new AlterColumnOperation(
                      "A",
                      new Column("P", typeof(int)), true);

            var operations = PreProcess(modelBuilder, alterColumnOperation);

            Assert.Equal(2, operations.Count);

            Assert.IsType <DropDefaultConstraintOperation>(operations[0]);
            Assert.Same(alterColumnOperation, operations[1]);

            var dropDefaultConstraintOperation = (DropDefaultConstraintOperation)operations[0];

            Assert.Same("P", dropDefaultConstraintOperation.ColumnName);
        }
Exemple #2
0
        public void Visit_with_alter_column_operation_resets_primary_key()
        {
            var modelBuilder = new BasicModelBuilder();

            modelBuilder.Entity("A",
                                b =>
            {
                b.Property <string>("Id");
                b.Key("Id");
            });

            var alterColumnOperation
                = new AlterColumnOperation(
                      "A",
                      new Column("Id", typeof(int))
            {
                IsNullable = false
            },
                      true);

            var operations = PreProcess(modelBuilder, alterColumnOperation);

            Assert.Equal(3, operations.Count);

            Assert.IsType <DropPrimaryKeyOperation>(operations[0]);
            Assert.Same(alterColumnOperation, operations[1]);
            Assert.IsType <AddPrimaryKeyOperation>(operations[2]);

            var dropPrimaryKeyOperation = (DropPrimaryKeyOperation)operations[0];
            var addPrimaryKeyOperation  = (AddPrimaryKeyOperation)operations[2];

            Assert.Equal("PK_A", dropPrimaryKeyOperation.PrimaryKeyName);
            Assert.Equal("PK_A", addPrimaryKeyOperation.PrimaryKeyName);
            Assert.Equal(new[] { "Id" }, addPrimaryKeyOperation.ColumnNames);
        }
Exemple #3
0
        public void Visit_with_alter_column_operation_resets_indexes()
        {
            var modelBuilder = new BasicModelBuilder();

            modelBuilder.Entity("A",
                                b =>
            {
                b.Property <int>("Id");
                b.Property <string>("P");
                b.Key("Id");
                b.Index("P");
            });

            var alterColumnOperation
                = new AlterColumnOperation(
                      "A",
                      new Column("P", typeof(int)), true);

            var operations = PreProcess(modelBuilder, alterColumnOperation);

            Assert.Equal(3, operations.Count);

            Assert.IsType <DropIndexOperation>(operations[0]);
            Assert.Same(alterColumnOperation, operations[1]);
            Assert.IsType <CreateIndexOperation>(operations[2]);

            var dropIndexOperation   = (DropIndexOperation)operations[0];
            var createIndexOperation = (CreateIndexOperation)operations[2];

            Assert.Equal("IX_A_P", dropIndexOperation.IndexName);
            Assert.Equal("IX_A_P", createIndexOperation.IndexName);
            Assert.Equal(new[] { "P" }, createIndexOperation.ColumnNames);
        }
Exemple #4
0
        public void Visit_with_alter_column_does_not_reset_indexes_if_same_type_but_smaller_max_length()
        {
            var database = new DatabaseModel();
            var column
                = new Column("Id", typeof(string))
                {
                MaxLength = 10
                };
            var table = new Table("A", new[] { column });
            var index = new Index("IX", new[] { column });

            database.AddTable(table);
            table.AddIndex(index);

            var alterColumnOperation
                = new AlterColumnOperation(
                      "A",
                      new Column("Id", typeof(string))
            {
                MaxLength = 9
            }, true);

            var operations = PreProcess(database, alterColumnOperation);

            Assert.Equal(1, operations.Count);

            Assert.Same(alterColumnOperation, operations[0]);
        }
Exemple #5
0
        public void Visit_with_alter_column_operation_and_timestamp_column()
        {
            var database = new DatabaseModel();
            var column0
                = new Column("Id", typeof(byte[]))
                {
                IsTimestamp = true
                };
            var column1 = new Column("P", typeof(string));
            var table   = new Table("A", new[] { column0, column1 });

            database.AddTable(table);

            var alterColumnOperation
                = new AlterColumnOperation(
                      "A",
                      new Column("Id", typeof(byte[])), true);

            var operations = PreProcess(database, alterColumnOperation);

            Assert.Equal(2, operations.Count);

            Assert.IsType <DropColumnOperation>(operations[0]);
            Assert.IsType <AddColumnOperation>(operations[1]);

            var dropColumnOperation = (DropColumnOperation)operations[0];
            var addColumnOperation  = (AddColumnOperation)operations[1];

            Assert.Equal("Id", dropColumnOperation.ColumnName);
            Assert.Equal("Id", addColumnOperation.Column.Name);
            Assert.False(addColumnOperation.Column.IsTimestamp);
        }
Exemple #6
0
        public static OperationBuilderSurface <AlterColumnOperation> AlterColumn <T>(this IMigrationBuilder builder, string name, string table, string schema = null, string catalog = null,
                                                                                     string storeType     = null, bool?unicode = null, int?size = null, int?precision = null, bool nullable = false,
                                                                                     object defaultValue  = null, string defaultValueSql = null, string computedColumnExpression = null,
                                                                                     string collationName = null, DbType?explicitDbType  = null)
        {
            var op = new AlterColumnOperation
            {
                Column = new ColumnDefinition
                {
                    Name = new SubObjectName {
                        Catalog = catalog, ParentName = table, Name = name, Schema = schema
                    },
                    Type                        = ColumnDefinition.InferType(explicitDbType, typeof(T), storeType, size, precision),
                    DefaultValue                = defaultValue,
                    IsNullable                  = nullable,
                    Unicode                     = unicode,
                    DefaultValueSql             = defaultValueSql,
                    ComputedColumnExpressionSql = computedColumnExpression,
                    CollationName               = null,
                }
            };

            builder.AddOperation(op);
            return(new OperationBuilderSurface <AlterColumnOperation>(op));
        }
        protected override void Generate(AlterColumnOperation alterColumnOperation)
        {
            // Делаем себе возможность избавиться от регистронезависимости
            base.Generate(alterColumnOperation);
            AnnotationValues values;

            if (alterColumnOperation.Column.Annotations.TryGetValue("CaseSensitive", out values))
            {
                if (values.NewValue != null && values.NewValue.ToString() == "True")
                {
                    using (var writer = Writer())
                    {
                        var columnSQL = BuildColumnType(alterColumnOperation.Column);
                        writer.WriteLine(
                            "ALTER TABLE {0} ALTER COLUMN {1} {2} COLLATE SQL_Latin1_General_CP1_CS_AS {3}",
                            alterColumnOperation.Table,
                            alterColumnOperation.Column.Name,
                            columnSQL,
                            alterColumnOperation.Column.IsNullable.HasValue == false || alterColumnOperation.Column.IsNullable.Value == true ? " NULL" : "NOT NULL"
                            );
                        Statement(writer);
                    }
                }
            }
        }
Exemple #8
0
        public void Visit_with_alter_column_operation_resets_unique_constraints_on_column()
        {
            var modelBuilder = new BasicModelBuilder();

            modelBuilder.Entity("A",
                                b =>
            {
                b.Property <int>("Id");
                var p = b.Property <string>("P").Metadata;
                b.Key("Id");
                b.Metadata.AddKey(p);
            });

            var alterColumnOperation
                = new AlterColumnOperation(
                      "A",
                      new Column("P", typeof(int)), true);

            var operations = PreProcess(modelBuilder, alterColumnOperation);

            Assert.Equal(3, operations.Count);

            Assert.IsType <DropUniqueConstraintOperation>(operations[0]);
            Assert.Same(alterColumnOperation, operations[1]);
            Assert.IsType <AddUniqueConstraintOperation>(operations[2]);

            var dropUniqueConstraintOperation = (DropUniqueConstraintOperation)operations[0];
            var addUniqueConstraintOperation  = (AddUniqueConstraintOperation)operations[2];

            Assert.Equal("UC_A_P", dropUniqueConstraintOperation.UniqueConstraintName);
            Assert.Equal("UC_A_P", addUniqueConstraintOperation.UniqueConstraintName);
            Assert.Equal(new[] { "P" }, addUniqueConstraintOperation.ColumnNames);
        }
Exemple #9
0
        /// <summary>
        /// 修改列。
        /// </summary>
        /// <typeparam name="TEntity">实体类型。</typeparam>
        /// <param name="type">字段类型。</param>
        /// <param name="unicode">是否为Unicode编码。</param>
        /// <param name="column">列表达式。</param>
        /// <param name="nullable">是否为空。</param>
        /// <param name="defaultValue">默认值。</param>
        /// <param name="defaultValueSql">默认值SQL字符串。</param>
        /// <param name="computedColumnSql">计算列的SQL字符串。</param>
        /// <returns>返回操作实例。</returns>
        public virtual AlterOperationBuilder <AlterColumnOperation> AlterColumn <TEntity>(
            Expression <Func <TEntity, object> > column,
            string type              = null,
            bool?unicode             = null,
            bool?nullable            = null,
            object defaultValue      = null,
            string defaultValueSql   = null,
            string computedColumnSql = null)
        {
            Check.NotNull(column, nameof(column));
            var property  = typeof(TEntity).GetEntityType().FindProperty(column.GetPropertyAccess().Name);
            var operation = new AlterColumnOperation
            {
                Table             = typeof(TEntity).GetTableName(),
                Name              = property.Name,
                ClrType           = property.ClrType,
                ColumnType        = type,
                IsUnicode         = unicode,
                IsIdentity        = property.IsIdentity,
                MaxLength         = property.MaxLength,
                IsRowVersion      = property.IsRowVersion,
                IsNullable        = nullable ?? property.IsNullable,
                DefaultValue      = defaultValue,
                DefaultValueSql   = defaultValueSql,
                ComputedColumnSql = computedColumnSql
            };

            Operations.Add(operation);

            return(new AlterOperationBuilder <AlterColumnOperation>(operation));
        }
 protected virtual void Generate(
     [NotNull] AlterColumnOperation operation,
     [CanBeNull] IModel model,
     [NotNull] MigrationCommandListBuilder builder)
 {
     throw new NotImplementedException();
 }
Exemple #11
0
        public virtual OperationBuilder <AlterColumnOperation> AlterColumn(
            [NotNull] string name,
            [NotNull] string table,
            [NotNull] string type,
            [CanBeNull] string schema            = null,
            bool nullable                        = false,
            [CanBeNull] object defaultValue      = null,
            [CanBeNull] string defaultValueSql   = null,
            [CanBeNull] string computedColumnSql = null)
        {
            Check.NotEmpty(name, nameof(name));
            Check.NotEmpty(table, nameof(table));

            var operation = new AlterColumnOperation
            {
                Schema            = schema,
                Table             = table,
                Name              = name,
                Type              = type,
                IsNullable        = nullable,
                DefaultValue      = defaultValue,
                DefaultValueSql   = defaultValueSql,
                ComputedColumnSql = computedColumnSql
            };

            Operations.Add(operation);

            return(new OperationBuilder <AlterColumnOperation>(operation));
        }
Exemple #12
0
        public void Process_with_alter_column_operation_drops_default_constraint()
        {
            var sourceModel        = new Model();
            var sourceModelBuilder = new BasicModelBuilder(sourceModel);

            sourceModelBuilder.Entity("A",
                                      b =>
            {
                b.Property <int>("Id");
                b.Property <string>("P").ForSqlServer().DefaultExpression("abc");
                b.Key("Id");
            });

            var inOperations = new MigrationOperationCollection();
            var alterColumnOperation
                = new AlterColumnOperation(
                      "A",
                      new Column("P", typeof(int)),
                      isDestructiveChange: false);

            inOperations.Add(alterColumnOperation);

            var operations = Process(inOperations, sourceModel);

            Assert.Equal(2, operations.Count);

            Assert.IsType <DropDefaultConstraintOperation>(operations[0]);
            Assert.Same(alterColumnOperation, operations[1]);

            var dropDefaultConstraintOperation = (DropDefaultConstraintOperation)operations[0];

            Assert.Same("P", dropDefaultConstraintOperation.ColumnName);
        }
Exemple #13
0
        /// <summary>
        /// Generates a migration operation to drpo an existing primary key.
        /// </summary>
        /// <param name="op">The operation that represents dropping an existing primary key.</param>
        /// <returns>A migration operation to drop an existing primary key.</returns>
        protected virtual MigrationStatement Generate(DropPrimaryKeyOperation op)
        {
            object        obj2;
            bool          deleteAutoIncrement = false;
            StringBuilder sb = new StringBuilder();


            op.AnonymousArguments.TryGetValue("DeleteAutoIncrement", out obj2);
            if (obj2 != null)
            {
                bool.TryParse(obj2.ToString(), out deleteAutoIncrement);
            }

            if (deleteAutoIncrement && op.Columns.Count == 1)
            {
                var newColumn = new ColumnModel(PrimitiveTypeKind.Int32, null);
                newColumn.Name = op.Columns[0];
                var alterColumn = new AlterColumnOperation(op.Table, newColumn, false);
                var ms          = Generate(alterColumn);
                sb.Append(ms.Sql + "; ");
            }

            return(new MigrationStatement {
                Sql = sb.ToString() + " alter table `" + op.Table + "` drop primary key "
            });
        }
Exemple #14
0
        /// <summary>
        /// Generates a migration operation to alter a column.
        /// </summary>
        /// <param name="op">The operation that represents altering an existing column.</param>
        /// <returns>A migration operation to alter a column.</returns>
        protected virtual MigrationStatement Generate(AlterColumnOperation op)
        {
            if (op == null)
            {
                return(null);
            }

            ColumnModel   column = op.Column;
            StringBuilder sb     = new StringBuilder();

            _tableName = op.Table;

            //verify if there is any "AddPrimaryKeyOperation" related with the column that will be added and if it is defined as identity (auto_increment)
            bool uniqueAttr = (from pkOpe in _pkOperations
                               where (from col in pkOpe.Columns
                                      where col == op.Column.Name
                                      select col).Count() > 0
                               select pkOpe).Count() > 0 & op.Column.IsIdentity;

            // for existing columns
            sb.Append("alter table `" + TrimSchemaPrefix(op.Table) + "` modify `" + column.Name + "` ");

            // add definition
            sb.Append(Generate(column) + (uniqueAttr ? " unique " : ""));

            return(new MigrationStatement {
                Sql = sb.ToString()
            });
        }
        protected override void Generate(AlterColumnOperation alterColumnOperation)
        {
            string tableName = getNameWithReplacedSchema(alterColumnOperation.Table);
            var    newAlterColumnOperation = new AlterColumnOperation(tableName, alterColumnOperation.Column, alterColumnOperation.IsDestructiveChange);

            base.Generate(newAlterColumnOperation);
        }
Exemple #16
0
        protected override void Generate(AlterColumnOperation operation, IModel model, MigrationCommandListBuilder builder)
        {
            ThrowIf.Argument.IsNull(operation, "AlterColumnOperation");
            ThrowIf.Argument.IsNull(model, "model");
            ThrowIf.Argument.IsNull(builder, "builder");

            var operationColumn = new AddColumnOperation();

            operationColumn.Schema            = operation.Schema;
            operationColumn.Table             = operation.Table;
            operationColumn.Name              = operation.Name;
            operationColumn.ClrType           = operation.ClrType;
            operationColumn.ColumnType        = operation.ColumnType;
            operationColumn.ComputedColumnSql = operation.ComputedColumnSql;
            operationColumn.DefaultValue      = operation.DefaultValue;
            operationColumn.DefaultValueSql   = operation.DefaultValueSql;

            builder
            .Append("ALTER TABLE " + operation.Table)
            .Append(" MODIFY ");
            ColumnDefinition(operationColumn, model, builder);
            builder
            .AppendLine(_sqlGenerationHelper.StatementTerminator);
            EndStatement(builder);
        }
        /// <inheritdoc />
        protected override void Generate(AlterColumnOperation operation, IModel model, MigrationCommandListBuilder builder)
        {
            base.Generate(operation, model, builder);

            var oldComment = GetComment(operation.OldColumn);
            var comment    = GetComment(operation);

            if (oldComment != comment)
            {
                builder.AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator);
                var dropDescription = oldComment != null;
                if (dropDescription)
                {
                    DropDescription(
                        builder,
                        operation.Schema,
                        operation.Table,
                        operation.Name);
                }

                if (comment != null)
                {
                    AddDescription(
                        builder,
                        comment,
                        operation.Schema,
                        operation.Table,
                        operation.Name,
                        omitSchemaVariable: dropDescription);
                }
                builder.EndCommand(suppressTransaction: IsMemoryOptimized(operation, model, operation.Schema, operation.Table));
            }
        }
Exemple #18
0
        protected override void Generate(AlterColumnOperation alterColumnOperation)
        {
            base.Generate(alterColumnOperation);
            AnnotationValues values;

            if (alterColumnOperation.Column.Annotations.TryGetValue("CaseSensitive", out values))
            {
                if (values.NewValue != null && values.NewValue.ToString() == "True")
                {
                    using (var writer = Writer())
                    {
                        if (alterColumnOperation.Column.IsNullable.HasValue && !alterColumnOperation.Column.IsNullable.Value)
                        {
                            writer.WriteLine(
                                "ALTER TABLE {0} ALTER COLUMN {1} NVARCHAR({2}) COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL",
                                alterColumnOperation.Table,
                                alterColumnOperation.Column.Name,
                                alterColumnOperation.Column.MaxLength);
                        }
                        else
                        {
                            writer.WriteLine(
                                "ALTER TABLE {0} ALTER COLUMN {1} NVARCHAR({2}) COLLATE SQL_Latin1_General_CP1_CS_AS NULL",
                                alterColumnOperation.Table,
                                alterColumnOperation.Column.Name,
                                alterColumnOperation.Column.MaxLength);
                        }
                        Statement(writer);
                    }
                }
            }
        }
        private void Generate(AlterColumnOperation migration)
        {
            using (var writer = Writer())
            {
                // create initial SQL
                var sql = string.Format("ALTER TABLE {0} ALTER COLUMN ",
                                        Name(migration.Table));

                writer.Write(sql);

                // generate the column name and type part
                var column = migration.Column;

                Generate(column, writer, true);

                // end the column type
                writer.Write(";");


                if (column.IsNullable != null)
                {
                    // create a new row to set nullable
                    writer.Write(sql);

                    writer.Write(Quote(column.Name));

                    writer.Write(" {0} NOT NULL;", column.IsNullable == true ? "DROP" : "SET");
                }

                Statement(writer);
            }
        }
Exemple #20
0
        public override void Visit(AlterColumnOperation alterColumnOperation, Context context)
        {
            Check.NotNull(alterColumnOperation, "alterColumnOperation");
            Check.NotNull(context, "context");

            var compositeOperation
                = context.CompositeOperation as CompositeAlterColumnOperation
                  ?? new CompositeAlterColumnOperation();

            var database  = context.Generator.Database;
            var table     = database.GetTable(alterColumnOperation.TableName);
            var column    = table.GetColumn(alterColumnOperation.NewColumn.Name);
            var newColumn = alterColumnOperation.NewColumn;

            string dataType, newDataType;

            GetDataTypes(table, column, newColumn, context, out dataType, out newDataType);

            if (table.PrimaryKey != null &&
                table.PrimaryKey.Columns.Any(c => ReferenceEquals(c, column)))
            {
                compositeOperation.AddPrimaryKey(table.PrimaryKey);
            }

            compositeOperation.AddForeignKeys(
                table.ForeignKeys
                .Where(fk => fk.Columns.Any(c => ReferenceEquals(c, column))));
            compositeOperation.AddForeignKeys(
                database.Tables
                .SelectMany(t => t.ForeignKeys)
                .Where(fk => fk.ReferencedColumns.Any(c => ReferenceEquals(c, column))));

            if (dataType != newDataType ||
                ((string.Equals(dataType, "varchar", StringComparison.OrdinalIgnoreCase) ||
                  string.Equals(dataType, "nvarchar", StringComparison.OrdinalIgnoreCase) ||
                  string.Equals(dataType, "varbinary", StringComparison.OrdinalIgnoreCase)) &&
                 newColumn.MaxLength > column.MaxLength))
            {
                compositeOperation.AddIndexes(
                    table.Indexes
                    .Where(ix => ix.Columns.Any(c => ReferenceEquals(c, column))));
            }

            if (column.HasDefault)
            {
                compositeOperation.AddOperation(new DropDefaultConstraintOperation(table.Name, column.Name));
            }

            if (column.IsTimestamp)
            {
                compositeOperation.AddOperation(new DropColumnOperation(table.Name, column.Name));
                compositeOperation.AddOperation(new AddColumnOperation(table.Name, newColumn));
            }
            else
            {
                compositeOperation.AddOperation(alterColumnOperation);
            }

            context.ProcessCompositeOperation(compositeOperation);
        }
Exemple #21
0
        public void Process_with_alter_column_does_not_reset_indexes_if_same_type_but_smaller_max_length()
        {
            var sourceModel        = new Model();
            var sourceModelBuilder = new BasicModelBuilder(sourceModel);

            sourceModelBuilder.Entity("A",
                                      b =>
            {
                b.Property <string>("Id").MaxLength(10);
                b.Key("Id");
                b.Index("Id").ForSqlServer().Name("IX");
            });

            var inOperations = new MigrationOperationCollection();
            var alterColumnOperation
                = new AlterColumnOperation(
                      "A",
                      new Column("Id", typeof(string))
            {
                MaxLength = 9
            },
                      isDestructiveChange: false);

            inOperations.Add(alterColumnOperation);

            var operations = Process(inOperations, sourceModel);

            Assert.Equal(3, operations.Count);

            Assert.IsType <DropPrimaryKeyOperation>(operations[0]);
            Assert.Same(alterColumnOperation, operations[1]);
            Assert.IsType <AddPrimaryKeyOperation>(operations[2]);
        }
Exemple #22
0
        /// <summary>
        /// 修改列。
        /// </summary>
        /// <param name="type">字段类型。</param>
        /// <param name="unicode">是否为Unicode编码。</param>
        /// <param name="table">表格名称。</param>
        /// <param name="name">字段。</param>
        /// <param name="nullable">是否为空。</param>
        /// <param name="identity">是否为自增长。</param>
        /// <param name="defaultValue">默认值。</param>
        /// <param name="defaultValueSql">默认值SQL字符串。</param>
        /// <param name="computedColumnSql">计算列的SQL字符串。</param>
        /// <returns>返回操作实例。</returns>
        public virtual AlterOperationBuilder <AlterColumnOperation> AlterColumn(
            string table,
            string name,
            string type              = null,
            bool?unicode             = null,
            bool?nullable            = true,
            bool identity            = false,
            object defaultValue      = null,
            string defaultValueSql   = null,
            string computedColumnSql = null)
        {
            Check.NotNull(name, nameof(name));
            var operation = new AlterColumnOperation
            {
                Table             = table,
                Name              = name,
                ColumnType        = type,
                IsUnicode         = unicode,
                IsIdentity        = identity,
                IsNullable        = nullable,
                DefaultValue      = defaultValue,
                DefaultValueSql   = defaultValueSql,
                ComputedColumnSql = computedColumnSql
            };

            Operations.Add(operation);

            return(new AlterOperationBuilder <AlterColumnOperation>(operation));
        }
Exemple #23
0
    protected override void Generate(AlterColumnOperation alterColumnOperation)
    {
        base.Generate(alterColumnOperation);
        AnnotationValues values;

        if (alterColumnOperation.Column.Annotations.TryGetValue("CaseSensitive", out values))
        {
            if (values.NewValue != null && values.NewValue.ToString() == "True")
            {
                using (var writer = Writer())
                {
                    //if (System.Diagnostics.Debugger.IsAttached == false) System.Diagnostics.Debugger.Launch();
                    // https://github.com/mono/entityframework/blob/master/src/EntityFramework.SqlServer/SqlServerMigrationSqlGenerator.cs
                    var columnSQL = BuildColumnType(alterColumnOperation.Column);     //[nvarchar](100)
                    writer.WriteLine(
                        "ALTER TABLE {0} ALTER COLUMN {1} {2} COLLATE SQL_Latin1_General_CP1_CS_AS {3}",
                        alterColumnOperation.Table,
                        alterColumnOperation.Column.Name,
                        columnSQL,
                        alterColumnOperation.Column.IsNullable.HasValue == false || alterColumnOperation.Column.IsNullable.Value == true ? " NULL" : "NOT NULL"     //todo not tested for DefaultValue
                        );
                    Statement(writer);
                }
            }
        }
    }
Exemple #24
0
        protected virtual void Generate([NotNull] AlterColumnOperation operation, [NotNull] IndentedStringBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            builder.AppendLine(".AlterColumn(");

            using (builder.Indent())
            {
                builder
                .Append("name: ")
                .Append(_code.Literal(operation.Name));

                if (operation.Schema != null)
                {
                    builder
                    .AppendLine(",")
                    .Append("schema: ")
                    .Append(_code.Literal(operation.Schema));
                }

                builder
                .AppendLine(",")
                .Append("table: ")
                .Append(_code.Literal(operation.Table))
                .AppendLine(",")
                .Append("type: ")
                .Append(_code.Literal(operation.Type))
                .AppendLine(",")
                .Append("nullable: ")
                .Append(_code.Literal(operation.IsNullable));

                if (operation.DefaultValueSql != null)
                {
                    builder
                    .AppendLine(",")
                    .Append("defaultValueSql: ")
                    .Append(_code.Literal(operation.DefaultValueSql));
                }
                else if (operation.ComputedColumnSql != null)
                {
                    builder
                    .AppendLine(",")
                    .Append("computedColumnSql: ")
                    .Append(_code.UnknownLiteral(operation.ComputedColumnSql));
                }
                else if (operation.DefaultValue != null)
                {
                    builder
                    .AppendLine(",")
                    .Append("defaultValue: ")
                    .Append(_code.UnknownLiteral(operation.DefaultValue));
                }

                builder.Append(")");

                Annotations(operation.Annotations, builder);
            }
        }
Exemple #25
0
 private void DropMaskingFunction(AlterColumnOperation operation, MigrationCommandListBuilder builder)
 {
     builder.Append("ALTER TABLE ")
     .Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Table, operation.Schema))
     .Append($" ALTER COLUMN {operation.Name}")
     .Append($" DROP MASKED")
     .EndCommand();
 }
Exemple #26
0
 private void AppendAlterColumn(AlterColumnOperation alterColumnOperation, StringBuilder sql)
 {
     sql.Append("ALTER TABLE ");
     AppendTableName(alterColumnOperation.Table, sql);
     sql.Append(" ALTER COLUMN \"");
     sql.Append(alterColumnOperation.Column.Name);
     sql.Append('"');
 }
        public virtual void Visit(AlterColumnOperation alterColumnOperation, DatabaseModel databaseModel)
        {
            var table     = databaseModel.GetTable(alterColumnOperation.TableName);
            var newColumn = alterColumnOperation.NewColumn;
            var column    = table.GetColumn(newColumn.Name);

            column.Copy(newColumn);
        }
Exemple #28
0
        protected virtual IEnumerable <MigrationOperation> Diff([NotNull] IProperty source, [NotNull] IProperty target)
        {
            var sourceAnnotations           = Annotations.For(source);
            var sourceEntityTypeAnnotations = Annotations.For(source.DeclaringEntityType.RootType());
            var targetAnnotations           = Annotations.For(target);

            if (sourceAnnotations.ColumnName != targetAnnotations.ColumnName)
            {
                yield return(new RenameColumnOperation
                {
                    Schema = sourceEntityTypeAnnotations.Schema,
                    Table = sourceEntityTypeAnnotations.TableName,
                    Name = sourceAnnotations.ColumnName,
                    NewName = targetAnnotations.ColumnName
                });
            }

            var sourceColumnType = sourceAnnotations.ColumnType
                                   ?? TypeMapper.GetMapping(source).DefaultTypeName;
            var targetColumnType = targetAnnotations.ColumnType
                                   ?? TypeMapper.GetMapping(target).DefaultTypeName;

            var targetMigrationsAnnotations = MigrationsAnnotations.For(target);

            var isSourceColumnNullable = source.IsColumnNullable();
            var isTargetColumnNullable = target.IsColumnNullable();
            var isNullableChanged      = isSourceColumnNullable != isTargetColumnNullable;
            var columnTypeChanged      = sourceColumnType != targetColumnType;

            if (isNullableChanged ||
                columnTypeChanged ||
                sourceAnnotations.DefaultValueSql != targetAnnotations.DefaultValueSql ||
                sourceAnnotations.ComputedValueSql != targetAnnotations.ComputedValueSql ||
                !Equals(sourceAnnotations.DefaultValue, targetAnnotations.DefaultValue) ||
                HasDifferences(MigrationsAnnotations.For(source), targetMigrationsAnnotations))
            {
                var isDestructiveChange = (isNullableChanged && isSourceColumnNullable)
                                          // TODO: Detect type narrowing
                                          || columnTypeChanged;

                var alterColumnOperation = new AlterColumnOperation
                {
                    Schema              = sourceEntityTypeAnnotations.Schema,
                    Table               = sourceEntityTypeAnnotations.TableName,
                    Name                = sourceAnnotations.ColumnName,
                    ClrType             = target.ClrType.UnwrapNullableType().UnwrapEnumType(),
                    ColumnType          = targetAnnotations.ColumnType,
                    IsNullable          = isTargetColumnNullable,
                    DefaultValue        = targetAnnotations.DefaultValue,
                    DefaultValueSql     = targetAnnotations.DefaultValueSql,
                    ComputedColumnSql   = targetAnnotations.ComputedValueSql,
                    IsDestructiveChange = isDestructiveChange
                };
                CopyAnnotations(targetMigrationsAnnotations, alterColumnOperation);

                yield return(alterColumnOperation);
            }
        }
Exemple #29
0
        public virtual AlterOperationBuilder <AlterColumnOperation> AlterColumn(
            string name,
            string table,
            Type clrType,
            string type                 = null,
            bool?unicode                = null,
            int?maxLength               = null,
            bool rowVersion             = false,
            string schema               = null,
            bool nullable               = false,
            object defaultValue         = null,
            string defaultValueSql      = null,
            string computedColumnSql    = null,
            Type oldClrType             = null,
            string oldType              = null,
            bool?oldUnicode             = null,
            int?oldMaxLength            = null,
            bool oldRowVersion          = false,
            bool oldNullable            = false,
            object oldDefaultValue      = null,
            string oldDefaultValueSql   = null,
            string oldComputedColumnSql = null)
        {
            Check.NotEmpty(name, nameof(name));
            Check.NotEmpty(table, nameof(table));

            var operation = new AlterColumnOperation
            {
                Schema            = schema,
                Table             = table,
                Name              = name,
                ClrType           = clrType,
                ColumnType        = type,
                IsUnicode         = unicode,
                MaxLength         = maxLength,
                IsRowVersion      = rowVersion,
                IsNullable        = nullable,
                DefaultValue      = defaultValue,
                DefaultValueSql   = defaultValueSql,
                ComputedColumnSql = computedColumnSql,
                OldColumn         = new ColumnOperation
                {
                    ClrType           = oldClrType ?? clrType,
                    ColumnType        = oldType,
                    IsUnicode         = oldUnicode,
                    MaxLength         = oldMaxLength,
                    IsRowVersion      = oldRowVersion,
                    IsNullable        = oldNullable,
                    DefaultValue      = oldDefaultValue,
                    DefaultValueSql   = oldDefaultValueSql,
                    ComputedColumnSql = oldComputedColumnSql
                }
            };

            Operations.Add(operation);

            return(new AlterOperationBuilder <AlterColumnOperation>(operation));
        }
        /// <summary>
        /// Generates SQL for a <see cref="AlterColumnOperation" />.
        /// Generated SQL should be added using the Statement method.
        /// </summary>
        /// <param name="alterColumnOperation"> The operation to produce SQL for. </param>
        protected virtual void Generate(AlterColumnOperation alterColumnOperation)
        {
            Check.NotNull(alterColumnOperation, "alterColumnOperation");

            var column = alterColumnOperation.Column;

            using (var writer = Writer())
            {
                writer.Write("ALTER TABLE ");
                writer.Write(Name(alterColumnOperation.Table));
                writer.Write(" ALTER COLUMN ");
                writer.Write(Quote(column.Name));
                writer.Write(" ");
                writer.Write(BuildColumnType(column));

                if ((column.IsNullable != null)
                    && !column.IsNullable.Value)
                {
                    writer.Write(" NOT");
                }

                writer.Write(" NULL");

                Statement(writer);
            }

            if ((column.DefaultValue != null)
                || !string.IsNullOrWhiteSpace(column.DefaultValueSql))
            {
                using (var writer = Writer())
                {
                    writer.Write("ALTER TABLE ");
                    writer.Write(Name(alterColumnOperation.Table));
                    writer.Write(" ALTER COLUMN ");
                    writer.Write(Quote(column.Name));
                    writer.Write(" DROP DEFAULT");

                    Statement(writer);
                }

                using (var writer = Writer())
                {
                    writer.Write("ALTER TABLE ");
                    writer.Write(Name(alterColumnOperation.Table));
                    writer.Write(" ALTER COLUMN ");
                    writer.Write(Quote(column.Name));
                    writer.Write(" SET DEFAULT ");
                    writer.Write(
                        (column.DefaultValue != null)
                            ? Generate((dynamic)column.DefaultValue)
                            : column.DefaultValueSql
                        );

                    Statement(writer);
                }
            }
        }