/// <summary> /// Builds commands for the given <see cref="RenameIndexOperation"/> by making calls on the /// given <see cref="MigrationCommandListBuilder"/>. /// </summary> /// <param name="operation">The operation.</param> /// <param name="model"> /// The target model which may be <c>null</c> if the operations exist without a model. /// </param> /// <param name="builder">The command builder to use to build the commands.</param> protected override void Generate(RenameIndexOperation operation, IModel model, MigrationCommandListBuilder builder) { var index = FindEntityTypes(model, operation.Schema, operation.Table) ?.SelectMany(t => t.GetDeclaredIndexes()).Where(i => i.Relational().Name == operation.NewName) .FirstOrDefault(); if (index == null) { throw new NotSupportedException( SqliteStrings.InvalidMigrationOperation(operation.GetType().ShortDisplayName())); } var dropOperation = new DropIndexOperation { Schema = operation.Schema, Table = operation.Table, Name = operation.Name }; dropOperation.AddAnnotations(_migrationsAnnotations.ForRemove(index)); var createOperation = new CreateIndexOperation { IsUnique = index.IsUnique, Name = operation.NewName, Schema = operation.Schema, Table = operation.Table, Columns = index.Properties.Select(p => p.Relational().ColumnName).ToArray(), Filter = index.Relational().Filter }; createOperation.AddAnnotations(_migrationsAnnotations.For(index)); Generate(dropOperation, model, builder, terminate: false); builder.AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator); Generate(createOperation, model, builder); }
protected override void Generate( AlterColumnOperation operation, IModel model, MigrationCommandListBuilder builder) { Check.NotNull(operation, nameof(operation)); Check.NotNull(builder, nameof(builder)); IEnumerable <IIndex> indexesToRebuild = null; var property = FindProperty(model, operation.Schema, operation.Table, operation.Name); if (operation.ComputedColumnSql != null) { var dropColumnOperation = new DropColumnOperation { Schema = operation.Schema, Table = operation.Table, Name = operation.Name }; if (property != null) { dropColumnOperation.AddAnnotations(_migrationsAnnotations.ForRemove(property)); } var addColumnOperation = new AddColumnOperation { Schema = operation.Schema, Table = operation.Table, Name = operation.Name, ClrType = operation.ClrType, ColumnType = operation.ColumnType, IsUnicode = operation.IsUnicode, MaxLength = operation.MaxLength, IsRowVersion = operation.IsRowVersion, IsNullable = operation.IsNullable, DefaultValue = operation.DefaultValue, DefaultValueSql = operation.DefaultValueSql, ComputedColumnSql = operation.ComputedColumnSql }; addColumnOperation.AddAnnotations(operation.GetAnnotations()); // TODO: Use a column rebuild instead indexesToRebuild = GetIndexesToRebuild(property, operation).ToList(); DropIndexes(indexesToRebuild, builder); Generate(dropColumnOperation, model, builder, terminate: false); builder.AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator); Generate(addColumnOperation, model, builder, terminate: false); builder.AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator); CreateIndexes(indexesToRebuild, builder); builder.EndCommand(); return; } var narrowed = false; if (IsOldColumnSupported(model)) { var valueGenerationStrategy = operation[ OracleAnnotationNames.ValueGenerationStrategy] as OracleValueGenerationStrategy?; var identity = valueGenerationStrategy == OracleValueGenerationStrategy.IdentityColumn; var oldValueGenerationStrategy = operation.OldColumn[ OracleAnnotationNames.ValueGenerationStrategy] as OracleValueGenerationStrategy?; var oldIdentity = oldValueGenerationStrategy == OracleValueGenerationStrategy.IdentityColumn; if (identity != oldIdentity) { throw new InvalidOperationException(OracleStrings.AlterIdentityColumn); } var type = operation.ColumnType ?? GetColumnType( operation.Schema, operation.Table, operation.Name, operation.ClrType, operation.IsUnicode, operation.MaxLength, operation.IsRowVersion, model); var oldType = operation.OldColumn.ColumnType ?? GetColumnType( operation.Schema, operation.Table, operation.Name, operation.OldColumn.ClrType, operation.OldColumn.IsUnicode, operation.OldColumn.MaxLength, operation.OldColumn.IsRowVersion, model); narrowed = type != oldType || !operation.IsNullable && operation.OldColumn.IsNullable; } if (narrowed) { indexesToRebuild = GetIndexesToRebuild(property, operation).ToList(); DropIndexes(indexesToRebuild, builder); } DropDefaultConstraint(operation.Schema, operation.Table, operation.Name, builder); builder .Append("ALTER TABLE ") .Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Table, operation.Schema)) .Append(" ALTER COLUMN "); ColumnDefinition( operation.Schema, operation.Table, operation.Name, operation.ClrType, operation.ColumnType, operation.IsUnicode, operation.MaxLength, operation.IsRowVersion, operation.IsNullable, /*defaultValue:*/ null, /*defaultValueSql:*/ null, operation.ComputedColumnSql, /*identity:*/ false, operation, model, builder); builder.AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator); if (operation.DefaultValue != null || operation.DefaultValueSql != null) { builder .Append("ALTER TABLE ") .Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Table, operation.Schema)) .Append(" ADD"); DefaultValue(operation.DefaultValue, operation.DefaultValueSql, builder); builder .Append(" FOR ") .Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Name)) .AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator); } if (narrowed) { CreateIndexes(indexesToRebuild, builder); } builder.EndCommand(); }
/// <summary> /// Builds commands for the given <see cref="AlterColumnOperation" /> /// by making calls on the given <see cref="MigrationCommandListBuilder" />. /// </summary> /// <param name="operation"> The operation. </param> /// <param name="model"> The target model which may be <c>null</c> if the operations exist without a model. </param> /// <param name="builder"> The command builder to use to build the commands. </param> protected override void Generate( AlterColumnOperation operation, IModel model, MigrationCommandListBuilder builder) { Check.NotNull(operation, nameof(operation)); Check.NotNull(builder, nameof(builder)); IEnumerable <IIndex> indexesToRebuild = null; var property = FindProperty(model, operation.Schema, operation.Table, operation.Name); if (operation.ComputedColumnSql != null) { var dropColumnOperation = new DropColumnOperation { Schema = operation.Schema, Table = operation.Table, Name = operation.Name }; if (property != null) { dropColumnOperation.AddAnnotations(_migrationsAnnotations.ForRemove(property)); } var addColumnOperation = new AddColumnOperation { Schema = operation.Schema, Table = operation.Table, Name = operation.Name, ClrType = operation.ClrType, ColumnType = operation.ColumnType, IsUnicode = operation.IsUnicode, MaxLength = operation.MaxLength, IsRowVersion = operation.IsRowVersion, IsNullable = operation.IsNullable, DefaultValue = operation.DefaultValue, DefaultValueSql = operation.DefaultValueSql, ComputedColumnSql = operation.ComputedColumnSql, IsFixedLength = operation.IsFixedLength }; addColumnOperation.AddAnnotations(operation.GetAnnotations()); // TODO: Use a column rebuild instead indexesToRebuild = GetIndexesToRebuild(property, operation) .ToList(); DropIndexes(indexesToRebuild, builder); Generate(dropColumnOperation, model, builder, terminate: false); builder.AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator); Generate(addColumnOperation, model, builder, terminate: false); builder.AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator); CreateIndexes(indexesToRebuild, builder); builder.EndCommand(); return; } var narrowed = false; if (IsOldColumnSupported(model)) { if (IsIdentity(operation) != IsIdentity(operation.OldColumn)) { throw new InvalidOperationException(JetStrings.AlterIdentityColumn); } var type = operation.ColumnType ?? GetColumnType( operation.Schema, operation.Table, operation.Name, operation, model); var oldType = operation.OldColumn.ColumnType ?? GetColumnType( operation.Schema, operation.Table, operation.Name, operation.OldColumn, model); narrowed = type != oldType || !operation.IsNullable && operation.OldColumn.IsNullable; } if (narrowed) { indexesToRebuild = GetIndexesToRebuild(property, operation) .ToList(); DropIndexes(indexesToRebuild, builder); } DropDefaultConstraint(operation.Table, operation.Name, builder); builder .Append("ALTER TABLE ") .Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Table)) .Append(" ALTER COLUMN "); // NB: DefaultValue, DefaultValueSql, and identity are handled elsewhere. Don't copy them here. var definitionOperation = new AlterColumnOperation { Schema = operation.Schema, Table = operation.Table, Name = operation.Name, ClrType = operation.ClrType, ColumnType = operation.ColumnType, IsUnicode = operation.IsUnicode, IsFixedLength = operation.IsFixedLength, MaxLength = operation.MaxLength, IsRowVersion = operation.IsRowVersion, IsNullable = operation.IsNullable, ComputedColumnSql = operation.ComputedColumnSql, OldColumn = operation.OldColumn }; definitionOperation.AddAnnotations( operation.GetAnnotations() .Where( a => a.Name != JetAnnotationNames.ValueGenerationStrategy && a.Name != JetAnnotationNames.Identity)); ColumnDefinition( operation.Schema, operation.Table, operation.Name, definitionOperation, model, builder); builder.AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator); if (operation.DefaultValue != null || operation.DefaultValueSql != null) { builder .Append("ALTER TABLE ") .Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Table)) .Append(" ADD"); DefaultValue(operation.DefaultValue, operation.DefaultValueSql, operation.ColumnType, builder); builder .Append(" FOR ") .Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Name)) .AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator); } // TODO: Implement comment/description support. (ADOX/DAO) /* * if (operation.OldColumn.Comment != operation.Comment) * { * var dropDescription = operation.OldColumn.Comment != null; * if (dropDescription) * { * DropDescription( * builder, * operation.Schema, * operation.Table, * operation.Name); * } * * if (operation.Comment != null) * { * AddDescription( * builder, operation.Comment, * operation.Schema, * operation.Table, * operation.Name, * omitSchemaVariable: dropDescription); * } * } */ if (narrowed) { CreateIndexes(indexesToRebuild, builder); } builder.EndCommand(); }