Пример #1
0
        private void AddConstraintFindColumn(DatabaseConstraint con, string name)
        {
            foreach (DatabaseColumn col in Columns)
            {
                if (col.Name.Equals(name, StringComparison.OrdinalIgnoreCase))
                {
                    switch (con.ConstraintType)
                    {
                    case ConstraintType.PrimaryKey:
                        col.IsPrimaryKey = true;
                        break;

                    case ConstraintType.ForeignKey:
                        if (!string.IsNullOrEmpty(con.RefersToTable))
                        {
                            //ignore fk constraint to a pk without a table.
                            col.IsForeignKey        = true;
                            col.ForeignKeyTableName = con.RefersToTable;
                        }
                        break;

                    case ConstraintType.UniqueKey:
                        col.IsUniqueKey = true;
                        break;
                    }
                    break;
                }
            }
        }
Пример #2
0
 /// <summary>
 /// Removes the foreign key and cleans the column markers.
 /// </summary>
 /// <param name="foreignKey">The foreign key.</param>
 /// <exception cref="System.ArgumentNullException">foreignKey;foreignkey cannot be null</exception>
 /// <exception cref="System.InvalidOperationException">Must be a foreign key</exception>
 internal void RemoveForeignKey(DatabaseConstraint foreignKey)
 {
     if (foreignKey == null)
     {
         throw new ArgumentNullException("foreignKey", "foreignkey cannot be null");
     }
     if (foreignKey.ConstraintType != ConstraintType.ForeignKey)
     {
         throw new InvalidOperationException("Must be a foreign key");
     }
     if (!_foreignKeys.Contains(foreignKey))
     {
         throw new InvalidOperationException("Foreign key not for this table or already removed");
     }
     _foreignKeys.Remove(foreignKey);
     foreach (var columnName in foreignKey.Columns)
     {
         var column = FindColumn(columnName);
         if (column != null)
         {
             column.IsForeignKey        = false;
             column.ForeignKeyTableName = null;
             column.ForeignKeyTable     = null;
         }
     }
 }
Пример #3
0
        /// <summary>
        /// Adds the constraint of any type (primary key, foreign key, unique key, check)
        /// </summary>
        /// <param name="con">The constraint.</param>
        public void AddConstraint(DatabaseConstraint con)
        {
            if (con == null)
            {
                throw new ArgumentNullException("con");
            }

            switch (con.ConstraintType)
            {
            case ConstraintType.PrimaryKey:
                PrimaryKey = con;
                break;

            case ConstraintType.ForeignKey:
                _foreignKeys.Add(con);
                break;

            case ConstraintType.UniqueKey:
                _uniqueKeys.Add(con);
                break;

            case ConstraintType.Check:
                _checkConstraints.Add(con);
                break;

            case ConstraintType.Default:
                _defaultConstraints.Add(con);
                break;
            }
            AddConstraintColumns(con);
        }
Пример #4
0
        /// <summary>
        /// Adds the column.
        /// </summary>
        /// <param name="databaseConstraint">The database constraint.</param>
        /// <param name="databaseColumn">The database column.</param>
        /// <returns></returns>
        /// <exception cref="System.ArgumentNullException">databaseConstraint</exception>
        public static DatabaseConstraint AddColumn(this DatabaseConstraint databaseConstraint, DatabaseColumn databaseColumn)
        {
            if (databaseConstraint == null)
            {
                throw new ArgumentNullException("databaseConstraint");
            }
            if (databaseColumn == null)
            {
                throw new ArgumentNullException("databaseColumn");
            }
            if (databaseColumn.TableName != databaseConstraint.TableName)
            {
                throw new InvalidOperationException("Constraint and column must belong to same table");
            }

            databaseConstraint.Columns.Add(databaseColumn.Name);
            switch (databaseConstraint.ConstraintType)
            {
            case ConstraintType.ForeignKey:
                databaseColumn.IsForeignKey        = true;
                databaseColumn.ForeignKeyTableName = databaseConstraint.RefersToTable;
                break;

            case ConstraintType.PrimaryKey:
                databaseColumn.IsPrimaryKey = true;
                break;

            case ConstraintType.UniqueKey:
                databaseColumn.IsUniqueKey = true;
                break;
            }

            return(databaseConstraint);
        }
Пример #5
0
 private void AddConstraintColumns(DatabaseConstraint con)
 {
     if (con == null)
     {
         return;
     }
     foreach (string name in con.Columns)
     {
         AddConstraintFindColumn(con, name);
     }
 }
Пример #6
0
        /// <summary>
        /// Adds a foreign key with a single column
        /// </summary>
        /// <param name="databaseColumn">The database column.</param>
        /// <param name="foreignKeyName">Name of the foreign key.</param>
        /// <param name="foreignTableName">Name of the foreign table.</param>
        /// <param name="foreignTableSchemaOwner">The foreign table schema owner.</param>
        /// <returns></returns>
        /// <exception cref="System.ArgumentNullException">
        /// databaseColumn;databaseColumn must not be null
        /// or
        /// foreignTableName;foreignTableName must not be null
        /// </exception>
        public static DatabaseColumn AddForeignKey(this DatabaseColumn databaseColumn,
                                                   string foreignKeyName,
                                                   string foreignTableName,
                                                   string foreignTableSchemaOwner)
        {
            if (databaseColumn == null)
            {
                throw new ArgumentNullException("databaseColumn", "databaseColumn must not be null");
            }
            if (string.IsNullOrEmpty(foreignTableName))
            {
                throw new ArgumentNullException("foreignTableName", "foreignTableName must not be null");
            }
            var table = databaseColumn.Table;

            if (string.IsNullOrEmpty(foreignKeyName)) //no fk name, so we'll invent one (it may be too long e.g. for Oracle)
            {
                foreignKeyName = "FK_" + table.Name + "_" + foreignTableName;
            }
            var foreignKey = new DatabaseConstraint
            {
                ConstraintType = ConstraintType.ForeignKey,
                Name           = foreignKeyName,
                TableName      = table.Name,
                RefersToTable  = foreignTableName,
                RefersToSchema = foreignTableSchemaOwner,
            };

            foreignKey.Columns.Add(databaseColumn.Name);
            table.AddConstraint(foreignKey);
            databaseColumn.IsForeignKey = true;

            //add the inverse relationship
            DatabaseTable fkTable;

            if (string.IsNullOrEmpty(foreignTableSchemaOwner))
            {
                fkTable = table.DatabaseSchema.FindTableByName(foreignTableName);
            }
            else
            {
                fkTable = table.DatabaseSchema.FindTableByName(foreignTableName, foreignTableSchemaOwner);
            }
            if (fkTable != null && !fkTable.ForeignKeyChildren.Contains(table))
            {
                fkTable.ForeignKeyChildren.Add(table);
                databaseColumn.ForeignKeyTable = fkTable;
            }

            return(databaseColumn);
        }
Пример #7
0
        /// <summary>
        /// Adds a unique key.
        /// </summary>
        /// <param name="databaseColumn">The database column.</param>
        /// <param name="uniqueKeyName">Name of the unique key.</param>
        /// <returns></returns>
        public static DatabaseColumn AddUniqueKey(this DatabaseColumn databaseColumn, string uniqueKeyName)
        {
            if (databaseColumn == null)
            {
                throw new ArgumentNullException("databaseColumn", "databaseColumn must not be null");
            }
            var table = databaseColumn.Table;
            var uk    = new DatabaseConstraint
            {
                ConstraintType = ConstraintType.UniqueKey,
                TableName      = table.Name,
                Name           = uniqueKeyName
            };

            uk.Columns.Add(databaseColumn.Name);
            table.AddConstraint(uk);
            databaseColumn.IsUniqueKey = true;
            return(databaseColumn);
        }