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; } } }
/// <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; } } }
/// <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); }
/// <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); }
private void AddConstraintColumns(DatabaseConstraint con) { if (con == null) { return; } foreach (string name in con.Columns) { AddConstraintFindColumn(con, name); } }
/// <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); }
/// <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); }