Esempio n. 1
0
        protected override Expression VisitCreateTable(SqlCreateTableExpression createTableExpression)
        {
            var autoIncrementColumn = createTableExpression.ColumnDefinitionExpressions.SingleOrDefault(c => c.ConstraintExpressions.OfType <SqlSimpleConstraintExpression>().Any(d => d.Constraint == SqlSimpleConstraint.AutoIncrement));

            if (autoIncrementColumn != null)
            {
                var primaryKeyConstraint = createTableExpression.TableConstraints.OfType <SqlSimpleConstraintExpression>().SingleOrDefault(c => c.Constraint == SqlSimpleConstraint.PrimaryKey);

                if (primaryKeyConstraint != null)
                {
                    if (!primaryKeyConstraint.ColumnNames.Contains(autoIncrementColumn.ColumnName))
                    {
                        var newPrimaryKeyConstraint = new SqlSimpleConstraintExpression(SqlSimpleConstraint.PrimaryKey, new [] { autoIncrementColumn.ColumnName });
                        var newUniqueConstraint     = new SqlSimpleConstraintExpression(SqlSimpleConstraint.Unique, primaryKeyConstraint.ColumnNames.Concat(autoIncrementColumn.ColumnName).ToArray());

                        return(createTableExpression.UpdateConstraints(createTableExpression.TableConstraints.Where(c => c != primaryKeyConstraint).Concat(newPrimaryKeyConstraint).Concat(newUniqueConstraint).ToReadOnlyCollection()));
                    }
                }
                else
                {
                    var newPrimaryKeyConstraint = new SqlSimpleConstraintExpression(SqlSimpleConstraint.PrimaryKey, new [] { autoIncrementColumn.ColumnName });

                    return(createTableExpression.UpdateConstraints(new [] { newPrimaryKeyConstraint }.ToReadOnlyCollection()));
                }
            }

            return(base.VisitCreateTable(createTableExpression));
        }
        protected override Expression VisitSimpleConstraint(SqlSimpleConstraintExpression simpleConstraintExpression)
        {
            base.VisitSimpleConstraint(simpleConstraintExpression);

            if (simpleConstraintExpression.Constraint != SqlSimpleConstraint.AutoIncrement)
            {
                return(simpleConstraintExpression);
            }

            var options = simpleConstraintExpression.Value as object[];

            if (options != null && options.Length == 2 && (options[0] as long?) > 0)
            {
                if (options[1] as long? == 0)
                {
                    options[1] = 1L;
                }

                this.Write("(");
                this.WriteDeliminatedListOfItems(options, this.Write);
                this.Write(")");
            }

            return(simpleConstraintExpression);
        }
        protected override Expression VisitCreateTable(SqlCreateTableExpression createTableExpression)
        {
            var primaryKeyConstraint = createTableExpression
                                       .TableConstraints
                                       .OfType <SqlSimpleConstraintExpression>()
                                       .SingleOrDefault(c => c.Constraint == SqlSimpleConstraint.PrimaryKey);

            if (primaryKeyConstraint != null)
            {
                var autoIncrementColumns = createTableExpression
                                           .ColumnDefinitionExpressions
                                           .SelectMany(c => c.ConstraintExpressions.OfType <SqlSimpleConstraintExpression>().Select(d => new { Constraint = d, ColumnDefinition = c }))
                                           .Where(c => c.Constraint.Constraint == SqlSimpleConstraint.AutoIncrement)
                                           .ToList();

                if (autoIncrementColumns.Count > 1)
                {
                    throw new UnsupportedDataAccessModelDefinitionException();
                }

                if (autoIncrementColumns.Count > 0)
                {
                    var autoIncrementColumn = autoIncrementColumns.Single();

                    var newTableConstraints = createTableExpression
                                              .TableConstraints
                                              .Where(c => c != primaryKeyConstraint);

                    if (primaryKeyConstraint.ColumnNames.Length > 1)
                    {
                        var uniqueConstraint = new SqlSimpleConstraintExpression(SqlSimpleConstraint.Unique, primaryKeyConstraint.ColumnNames);

                        newTableConstraints = newTableConstraints.Concat(uniqueConstraint);
                    }

                    primaryKeyNameByTablesWithReducedPrimaryKeyName[createTableExpression.Table.Name] = autoIncrementColumn.ColumnDefinition.ColumnName;

                    columnsToMakeNotNull.Clear();

                    primaryKeyConstraint
                    .ColumnNames
                    .Where(c => c != autoIncrementColumn.ColumnDefinition.ColumnName)
                    .ForEach(c => columnsToMakeNotNull.Add(c));

                    createTableExpression = new SqlCreateTableExpression
                                            (
                        createTableExpression.Table,
                        createTableExpression.IfNotExist,
                        this.VisitExpressionList(createTableExpression.ColumnDefinitionExpressions),
                        newTableConstraints
                                            );

                    columnsToMakeNotNull.Clear();

                    return(createTableExpression);
                }
            }

            return(base.VisitCreateTable(createTableExpression));
        }
        protected override Expression VisitSimpleConstraint(SqlSimpleConstraintExpression simpleConstraintExpression)
        {
            if (this.currentIsPrimaryKey && simpleConstraintExpression.Constraint == SqlSimpleConstraint.AutoIncrement)
            {
                return(null);
            }

            return(base.VisitSimpleConstraint(simpleConstraintExpression));
        }
Esempio n. 5
0
        protected override Expression VisitSimpleConstraint(SqlSimpleConstraintExpression simpleConstraintExpression)
        {
            switch (simpleConstraintExpression.Constraint)
            {
            case SqlSimpleConstraint.DefaultValue:
                if (simpleConstraintExpression.Value != null)
                {
                    this.Write("DEFAULT");
                    this.Write(" ");
                    this.Write(simpleConstraintExpression.Value);
                }
                break;

            case SqlSimpleConstraint.NotNull:
                this.Write("NOT NULL");
                break;

            case SqlSimpleConstraint.AutoIncrement:
            {
                var s = this.sqlDialect.GetSyntaxSymbolString(SqlSyntaxSymbol.AutoIncrement);

                if (!string.IsNullOrEmpty(s))
                {
                    this.Write(this.sqlDialect.GetSyntaxSymbolString(SqlSyntaxSymbol.AutoIncrement));
                }
                break;
            }

            case SqlSimpleConstraint.PrimaryKey:
                this.Write("PRIMARY KEY");
                if (simpleConstraintExpression.ColumnNames != null)
                {
                    this.Write("(");
                    this.WriteDeliminatedListOfItems(simpleConstraintExpression.ColumnNames, this.WriteQuotedIdentifier);
                    this.Write(")");
                }
                break;

            case SqlSimpleConstraint.Unique:
                this.Write("UNIQUE");
                if (simpleConstraintExpression.ColumnNames != null)
                {
                    this.Write("(");
                    this.WriteDeliminatedListOfItems(simpleConstraintExpression.ColumnNames, this.WriteQuotedIdentifier);
                    this.Write(")");
                }
                break;
            }

            return(simpleConstraintExpression);
        }
        private Expression BuildCreateTableExpression(TypeDescriptor typeDescriptor)
        {
            var columnExpressions = new List <SqlColumnDefinitionExpression>();

            this.currentTableConstraints = new List <Expression>();

            var columnInfos = QueryBinder.GetColumnInfos
                              (
                this.model.TypeDescriptorProvider,
                typeDescriptor.PersistedProperties,
                (c, d) => c.IsPrimaryKey && !c.PropertyType.IsDataAccessObjectType(),
                (c, d) => c.IsPrimaryKey
                              );

            foreach (var columnInfo in columnInfos)
            {
                columnExpressions.Add(this.BuildColumnDefinition(columnInfo));
            }

            columnInfos = QueryBinder.GetColumnInfos
                          (
                this.model.TypeDescriptorProvider,
                typeDescriptor.PersistedPropertiesWithoutBackreferences.Where(c => !c.PropertyType.IsDataAccessObjectType()),
                (c, d) => d == 0 ? !c.IsPrimaryKey : c.IsPrimaryKey,
                (c, d) => d == 0 ? !c.IsPrimaryKey : c.IsPrimaryKey
                          );

            foreach (var columnInfo in columnInfos)
            {
                columnExpressions.Add(this.BuildColumnDefinition(columnInfo));
            }

            foreach (var property in typeDescriptor.PersistedPropertiesWithoutBackreferences
                     .Where(c => c.PropertyType.IsDataAccessObjectType()))
            {
                columnInfos = QueryBinder.GetColumnInfos
                              (
                    this.model.TypeDescriptorProvider,
                    new [] { property },
                    (c, d) => d == 0 || c.IsPrimaryKey,
                    (c, d) => c.IsPrimaryKey
                              );

                columnExpressions.AddRange(this.BuildForeignKeyColumnDefinitions(property, columnInfos));
            }

            columnExpressions.AddRange(this.BuildRelatedColumnDefinitions(typeDescriptor));

            var tableName = typeDescriptor.PersistedName;

            var primaryKeys = QueryBinder.GetPrimaryKeyColumnInfos(this.model.TypeDescriptorProvider, typeDescriptor);

            if (primaryKeys.Length > 0)
            {
                var columnNames = primaryKeys.Select(c => c.ColumnName).ToArray();

                var compositePrimaryKeyConstraint = new SqlSimpleConstraintExpression(SqlSimpleConstraint.PrimaryKey, columnNames);

                this.currentTableConstraints.Add(compositePrimaryKeyConstraint);
            }

            return(new SqlCreateTableExpression(new SqlTableExpression(tableName), false, columnExpressions, this.currentTableConstraints, Enumerable.Empty <SqlTableOption>()));
        }
Esempio n. 7
0
 protected virtual Expression VisitSimpleConstraint(SqlSimpleConstraintExpression simpleConstraintExpression)
 {
     return(simpleConstraintExpression);
 }