protected virtual void UniqueConstraint(
            [NotNull] AddUniqueConstraintOperation operation,
            [CanBeNull] IModel model,
            [NotNull] MigrationCommandListBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            if (operation.Name != null)
            {
                builder
                .Append("CONSTRAINT ")
                .Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Name))
                .Append(" ");
            }

            builder
            .Append("UNIQUE ");

            IndexTraits(operation, model, builder);

            builder.Append("(")
            .Append(ColumnList(operation.Columns))
            .Append(")");
        }
Esempio n. 2
0
        public void Dispatches_visitor()
        {
            var operation = new AddUniqueConstraintOperation("dbo.MyTable", "MyUC", new[] { "Foo", "Bar" });

            var sqlGeneratorMock = MigrationsTestHelpers.MockSqlGenerator();
            var sqlBuilder       = new SqlBatchBuilder();

            operation.GenerateSql(sqlGeneratorMock.Object, sqlBuilder);

            sqlGeneratorMock.Verify(g => g.Generate(operation, sqlBuilder), Times.Once());

            var codeGeneratorMock = new Mock <MigrationCodeGenerator>(new Mock <ModelCodeGenerator>().Object);
            var codeBuilder       = new IndentedStringBuilder();

            operation.GenerateCode(codeGeneratorMock.Object, codeBuilder);

            codeGeneratorMock.Verify(g => g.Generate(operation, codeBuilder), Times.Once());

            var visitorMock = new Mock <MigrationOperationVisitor <object> >();
            var context     = new object();

            operation.Accept(visitorMock.Object, context);

            visitorMock.Verify(v => v.Visit(operation, context), Times.Once());
        }
Esempio n. 3
0
        /// <inheritdoc />
        protected override void Generate(AddUniqueConstraintOperation operation, IModel model, MigrationCommandListBuilder builder)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            if (operation.IfExistsCheckRequired())
            {
                throw new InvalidOperationException($"The check '{nameof(SqlServerOperationBuilderExtensions.IfExists)}()' is not allowed with '{operation.GetType().Name}'");
            }

            if (!operation.IfNotExistsCheckRequired())
            {
                base.Generate(operation, model, builder);
                return;
            }

            builder.AppendLine($"IF(OBJECT_ID('{DelimitIdentifier(operation.Name)}') IS NULL)")
            .AppendLine("BEGIN");

            _closeScopeBeforeEndingStatement = true;
            builder.IncrementIndent();

            base.Generate(operation, model, builder);
        }
Esempio n. 4
0
        protected virtual IEnumerable <MigrationOperation> Add(IKey target)
        {
            var targetExtensions           = MetadataExtensions.Extensions(target);
            var targetEntityTypeExtensions = MetadataExtensions.Extensions(target.EntityType.RootType());

            MigrationOperation operation;

            if (target.IsPrimaryKey())
            {
                operation = new AddPrimaryKeyOperation
                {
                    Schema  = targetEntityTypeExtensions.Schema,
                    Table   = targetEntityTypeExtensions.Table,
                    Name    = targetExtensions.Name,
                    Columns = GetColumnNames(target.Properties)
                };
            }
            else
            {
                operation = new AddUniqueConstraintOperation
                {
                    Schema  = targetEntityTypeExtensions.Schema,
                    Table   = targetEntityTypeExtensions.Table,
                    Name    = targetExtensions.Name,
                    Columns = GetColumnNames(target.Properties)
                };
            }
            CopyAnnotations(Annotations.For(target), operation);

            yield return(operation);
        }
Esempio n. 5
0
        public virtual void UniqueConstraint(
            [NotNull] AddUniqueConstraintOperation operation,
            [CanBeNull] IModel model,
            [NotNull] SqlBatchBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            if (operation.Name != null)
            {
                builder
                .Append("CONSTRAINT ")
                .Append(_sql.DelimitIdentifier(operation.Name))
                .Append(" ");
            }

            builder
            .Append("UNIQUE ");

            IndexTraits(operation, model, builder);

            builder.Append("(")
            .Append(ColumnList(operation.Columns))
            .Append(")");
        }
        protected virtual IEnumerable <MigrationOperation> Add([NotNull] IKey target)
        {
            var targetAnnotations           = Annotations.For(target);
            var targetEntityTypeAnnotations = Annotations.For(target.DeclaringEntityType.RootType());

            MigrationOperation operation;

            if (target.IsPrimaryKey())
            {
                operation = new AddPrimaryKeyOperation
                {
                    Schema  = targetEntityTypeAnnotations.Schema,
                    Table   = targetEntityTypeAnnotations.TableName,
                    Name    = targetAnnotations.Name,
                    Columns = GetColumns(target.Properties)
                };
            }
            else
            {
                operation = new AddUniqueConstraintOperation
                {
                    Schema  = targetEntityTypeAnnotations.Schema,
                    Table   = targetEntityTypeAnnotations.TableName,
                    Name    = targetAnnotations.Name,
                    Columns = GetColumns(target.Properties)
                };
            }
            CopyAnnotations(MigrationsAnnotations.For(target), operation);

            yield return(operation);
        }
Esempio n. 7
0
        public void Create_and_initialize_operation()
        {
            var operation = new AddUniqueConstraintOperation("dbo.MyTable", "MyUC", new[] { "Foo", "Bar" });

            Assert.Equal("dbo.MyTable", operation.TableName);
            Assert.Equal("MyUC", operation.UniqueConstraintName);
            Assert.Equal(new[] { "Foo", "Bar" }, operation.ColumnNames);
            Assert.False(operation.IsDestructiveChange);
        }
        public void Generate_when_add_unique_constraint_operation()
        {
            var operation = new AddUniqueConstraintOperation("dbo.MyTable", "MyUC", new[] { "Foo", "Bar" });

            Assert.Equal(
                @"AddUniqueConstraint(""dbo.MyTable"", ""MyUC"", new[] { ""Foo"", ""Bar"" })",
                CSharpMigrationCodeGenerator.Generate(operation));

            GenerateAndValidateCode(operation);
        }
        public virtual void Generate([NotNull] AddUniqueConstraintOperation addUniqueConstraintOperation, [NotNull] SqlBatchBuilder batchBuilder)
        {
            Check.NotNull(addUniqueConstraintOperation, "addUniqueConstraintOperation");
            Check.NotNull(batchBuilder, "batchBuilder");

            batchBuilder
            .Append("ALTER TABLE ")
            .Append(DelimitIdentifier(addUniqueConstraintOperation.TableName))
            .Append(" ADD ");

            GenerateUniqueConstraint(addUniqueConstraintOperation, batchBuilder);
        }
Esempio n. 10
0
        protected override void GenerateUniqueConstraint(
            AddUniqueConstraintOperation uniqueConstraintOperation,
            IndentedStringBuilder stringBuilder)
        {
            Check.NotNull(uniqueConstraintOperation, "uniqueConstraintOperation");
            Check.NotNull(stringBuilder, "stringBuilder");

            stringBuilder
            .Append("UNIQUE (")
            .Append(uniqueConstraintOperation.ColumnNames.Select(DelimitIdentifier).Join())
            .Append(")");
        }
        public virtual void Generate([NotNull] AddUniqueConstraintOperation addUniqueConstraintOperation, [NotNull] IndentedStringBuilder stringBuilder)
        {
            Check.NotNull(addUniqueConstraintOperation, "addUniqueConstraintOperation");
            Check.NotNull(stringBuilder, "stringBuilder");

            stringBuilder
            .Append("ALTER TABLE ")
            .Append(DelimitIdentifier(addUniqueConstraintOperation.TableName))
            .Append(" ADD ");

            GenerateUniqueConstraint(addUniqueConstraintOperation, stringBuilder);
        }
Esempio n. 12
0
        public override void Visit(AddUniqueConstraintOperation addUniqueConstraintOperation, DatabaseModel databaseModel)
        {
            Check.NotNull(addUniqueConstraintOperation, "addUniqueConstraintOperation");
            Check.NotNull(databaseModel, "databaseModel");

            var table = databaseModel.GetTable(addUniqueConstraintOperation.TableName);

            table.AddUniqueConstraint(
                new UniqueConstraint(
                    addUniqueConstraintOperation.UniqueConstraintName,
                    addUniqueConstraintOperation.ColumnNames.Select(table.GetColumn).ToArray()));
        }
    public async Task AddUniqueConstraintNoName()
    {
        var operation = new AddUniqueConstraintOperation()
        {
            Table   = "People",
            Columns = new[] { "Foo" },
        };
        var batch = await Generate(new[] { operation });

        Assert.AreEqual(1, batch.Count());
        Assert.AreEqual(NewLineEnd(@"ALTER TABLE ""People"" ADD UNIQUE (""Foo"");"), batch[0].CommandText);
    }
    public async Task AddUniqueConstraintTwoColumns()
    {
        var operation = new AddUniqueConstraintOperation()
        {
            Table   = "People",
            Name    = "UNQ_People_Foo_Bar",
            Columns = new[] { "Foo", "Bar" },
        };
        var batch = await Generate(new[] { operation });

        Assert.AreEqual(1, batch.Count());
        Assert.AreEqual(NewLineEnd(@"ALTER TABLE ""People"" ADD CONSTRAINT ""UNQ_People_Foo_Bar"" UNIQUE (""Foo"", ""Bar"");"), batch[0].CommandText);
    }
Esempio n. 15
0
        public override void Generate(AddUniqueConstraintOperation addUniqueConstraintOperation, IndentedStringBuilder stringBuilder)
        {
            Check.NotNull(addUniqueConstraintOperation, "addUniqueConstraintOperation");
            Check.NotNull(stringBuilder, "stringBuilder");

            stringBuilder
            .Append("AddUniqueConstraint(")
            .Append(GenerateLiteral(addUniqueConstraintOperation.TableName))
            .Append(", ")
            .Append(GenerateLiteral(addUniqueConstraintOperation.UniqueConstraintName))
            .Append(", new[] { ")
            .Append(addUniqueConstraintOperation.ColumnNames.Select(GenerateLiteral).Join())
            .Append(" })");
        }
        protected virtual void GenerateUniqueConstraint(
            [NotNull] AddUniqueConstraintOperation uniqueConstraintOperation,
            [NotNull] SqlBatchBuilder batchBuilder)
        {
            Check.NotNull(uniqueConstraintOperation, "uniqueConstraintOperation");
            Check.NotNull(batchBuilder, "batchBuilder");

            batchBuilder
            .Append("CONSTRAINT ")
            .Append(DelimitIdentifier(uniqueConstraintOperation.UniqueConstraintName))
            .Append(" UNIQUE (")
            .Append(uniqueConstraintOperation.ColumnNames.Select(DelimitIdentifier).Join())
            .Append(")");
        }
Esempio n. 17
0
        protected virtual void Generate(
            [NotNull] AddUniqueConstraintOperation operation,
            [CanBeNull] IModel model,
            [NotNull] RelationalCommandListBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            builder
            .Append("ALTER TABLE ")
            .Append(SqlGenerator.DelimitIdentifier(operation.Table, operation.Schema))
            .Append(" ADD ");
            UniqueConstraint(operation, model, builder);
        }
Esempio n. 18
0
        public virtual void Generate(
            [NotNull] AddUniqueConstraintOperation operation,
            [CanBeNull] IModel model,
            [NotNull] SqlBatchBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            builder
            .Append("ALTER TABLE ")
            .Append(_sql.DelimitIdentifier(operation.Table, operation.Schema))
            .Append(" ADD ");
            UniqueConstraint(operation, model, builder);
        }
Esempio n. 19
0
        /// <summary>
        /// 添加唯一键。
        /// </summary>
        /// <param name="operation">操作实例。</param>
        /// <param name="builder"><see cref="MigrationCommandListBuilder"/>实例对象。</param>
        protected virtual void Generate(
            AddUniqueConstraintOperation operation,
            MigrationCommandListBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            builder
            .Append("ALTER TABLE ")
            .Append(operation.Table)
            .Append(" ADD ");
            UniqueConstraint(operation, builder);
            builder.AppendLine(SqlHelper.StatementTerminator);
            EndStatement(builder);
        }
        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(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Table, operation.Schema))
            .Append(" ADD ");
            UniqueConstraint(operation, model, builder);
            builder.AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator);
            EndStatement(builder);
        }
Esempio n. 21
0
        /// <summary>
        /// 添加唯一键。
        /// </summary>
        /// <param name="table">表格名称。</param>
        /// <param name="columns">字段列表。</param>
        /// <param name="clustered">是否聚合。</param>
        /// <returns>返回构建实例对象。</returns>
        public virtual OperationBuilder <AddUniqueConstraintOperation> AddUniqueConstraint(string table, string[] columns, bool clustered = false)
        {
            Check.NotNull(columns, nameof(columns));

            var operation = new AddUniqueConstraintOperation
            {
                Table       = table,
                Columns     = columns,
                IsClustered = clustered
            };

            operation.Name = OperationHelper.GetName(NameType.UniqueKey, operation.Table, operation.Columns);
            Operations.Add(operation);

            return(new OperationBuilder <AddUniqueConstraintOperation>(operation));
        }
Esempio n. 22
0
        /// <summary>
        /// 添加唯一键。
        /// </summary>
        /// <typeparam name="TEntity">实体类型。</typeparam>
        /// <param name="columns">列表达式。</param>
        /// <param name="clustered">是否聚合。</param>
        /// <returns>返回构建实例对象。</returns>
        public virtual OperationBuilder <AddUniqueConstraintOperation> AddUniqueConstraint <TEntity>(Expression <Func <TEntity, object> > columns, bool clustered = false)
        {
            Check.NotNull(columns, nameof(columns));

            var operation = new AddUniqueConstraintOperation
            {
                Table       = typeof(TEntity).GetTableName(),
                Columns     = columns.GetPropertyNames(),
                IsClustered = clustered
            };

            operation.Name = OperationHelper.GetName(NameType.UniqueKey, operation.Table, operation.Columns);
            Operations.Add(operation);

            return(new OperationBuilder <AddUniqueConstraintOperation>(operation));
        }
Esempio n. 23
0
        /// <summary>
        ///     Configures a unique constraint on the table.
        /// </summary>
        /// <param name="name"> The constraint name. </param>
        /// <param name="columns"> The columns that make up the constraint. </param>
        /// <returns> The same builder so that multiple calls can be chained. </returns>
        public virtual OperationBuilder <AddUniqueConstraintOperation> UniqueConstraint(
            [NotNull] string name,
            [NotNull] Expression <Func <TColumns, object> > columns)
        {
            Check.NotEmpty(name, nameof(name));
            Check.NotNull(columns, nameof(columns));

            var operation = new AddUniqueConstraintOperation
            {
                Schema = Operation.Schema, Table = Operation.Name, Name = name, Columns = Map(columns)
            };

            Operation.UniqueConstraints.Add(operation);

            return(new OperationBuilder <AddUniqueConstraintOperation>(operation));
        }
    /// <summary>
    ///     Creates a new <see cref="AddUniqueConstraintOperation" /> from the specified unique constraint.
    /// </summary>
    /// <param name="uniqueConstraint">The unique constraint.</param>
    /// <returns>The operation.</returns>
    public static AddUniqueConstraintOperation CreateFrom(IUniqueConstraint uniqueConstraint)
    {
        Check.NotNull(uniqueConstraint, nameof(uniqueConstraint));

        var operation = new AddUniqueConstraintOperation
        {
            Schema  = uniqueConstraint.Table.Schema,
            Table   = uniqueConstraint.Table.Name,
            Name    = uniqueConstraint.Name,
            Columns = uniqueConstraint.Columns.Select(c => c.Name).ToArray()
        };

        operation.AddAnnotations(uniqueConstraint.GetAnnotations());

        return(operation);
    }
Esempio n. 25
0
        /// <summary>
        /// 添加唯一键。
        /// </summary>
        /// <param name="columns">列。</param>
        /// <param name="action">添加扩展信息。</param>
        /// <returns>返回迁移构建实例。</returns>
        public virtual CreateTableBuilder <TEntity> UniqueConstraint(
            [NotNull] Expression <Func <TEntity, object> > columns,
            Action <OperationBuilder <AddUniqueConstraintOperation> > action = null)
        {
            Check.NotNull(columns, nameof(columns));

            var operation = new AddUniqueConstraintOperation
            {
                Table   = Operation.Table,
                Columns = columns.GetPropertyNames()
            };

            operation.Name = OperationHelper.GetName(NameType.UniqueKey, operation.Table, operation.Columns);
            Operation.UniqueConstraints.Add(operation);

            action?.Invoke(new OperationBuilder <AddUniqueConstraintOperation>(operation));
            return(this);
        }
Esempio n. 26
0
        public virtual OperationBuilder <AddUniqueConstraintOperation> AddUniqueConstraint(string name, string table, string[] columns, string schema = null)
        {
            Check.NotEmpty(name, nameof(name));
            Check.NotEmpty(table, nameof(table));
            Check.NotEmpty(columns, nameof(columns));

            var operation = new AddUniqueConstraintOperation
            {
                Schema  = schema,
                Table   = table,
                Name    = name,
                Columns = columns
            };

            Operations.Add(operation);

            return(new OperationBuilder <AddUniqueConstraintOperation>(operation));
        }
        public void Visit_with_add_unique_constraint_operation()
        {
            var model     = new DatabaseModel();
            var column    = new Column("Foo", typeof(int));
            var table     = new Table("dbo.MyTable", new[] { column });
            var operation = new AddUniqueConstraintOperation("dbo.MyTable", "UK", new[] { "Foo" });

            model.AddTable(table);

            Assert.Equal(0, table.UniqueConstraints.Count);

            operation.Accept(new DatabaseModelModifier(), model);

            Assert.Equal(1, table.UniqueConstraints.Count);

            var uniqueConstraint = table.UniqueConstraints[0];

            Assert.Equal("UK", uniqueConstraint.Name);
            Assert.Equal(1, uniqueConstraint.Columns.Count);
            Assert.Same(column, uniqueConstraint.Columns[0]);
        }
Esempio n. 28
0
        /// <summary>
        /// 添加唯一键的相关定义。
        /// </summary>
        /// <param name="operation">操作实例。</param>
        /// <param name="builder"><see cref="MigrationCommandListBuilder"/>实例。</param>
        protected virtual void UniqueConstraint(
            AddUniqueConstraintOperation operation,
            MigrationCommandListBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            if (operation.Name != null)
            {
                builder
                .Append("CONSTRAINT ")
                .Append(SqlHelper.DelimitIdentifier(operation.Name))
                .Append(" ");
            }

            builder
            .Append("UNIQUE ");

            IndexTraits(operation.IsClustered, builder);

            builder.Append("(")
            .Append(ColumnList(operation.Columns))
            .Append(")");
        }
Esempio n. 29
0
        protected virtual void Generate([NotNull] AddUniqueConstraintOperation operation, [NotNull] IndentedStringBuilder builder)
        {
            Check.NotNull(operation, nameof(operation));
            Check.NotNull(builder, nameof(builder));

            builder.AppendLine(".AddUniqueConstraint(");

            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(
                    operation.Columns.Length == 1
                            ? "column: "
                            : "columns: ")
                .Append(_code.Literal(operation.Columns))
                .Append(")");

                Annotations(operation.Annotations, builder);
            }
        }
Esempio n. 30
0
 protected override void Generate(AddUniqueConstraintOperation operation, IModel model, MigrationCommandListBuilder builder)
 {
     throw new NotSupportedException(SqliteStrings.InvalidMigrationOperation(operation.GetType().ShortDisplayName()));
 }