private void Save() { if (RelatedTable == null) { MessageBox.Show(this, "You need to select a foreign table.", "Foreign table missing", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } if (RelatedColumnCombos.Count == 0) { MessageBox.Show(this, "No columns selected.", "Columns missing", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } bool mainColsAreUnique; // = checkBoxPrimaryUnique.Checked ? true : ColumnsAreUnique(GetMainColumns()); bool relatedColsAreUnique; // = checkBoxForeignUnique.Checked ? true : ColumnsAreUnique(GetRelatedColumns()); // Check if the Main columns are unique if (checkBoxPrimaryUnique.Checked) { mainColsAreUnique = true; } else { List <Column> mainColumns = GetMainColumns(); bool selectedColsContainAllPrimaryCols = MainTable.ColumnsInPrimaryKey.Count() > 0; foreach (var col in MainTable.ColumnsInPrimaryKey) { if (!mainColumns.Contains(col)) { selectedColsContainAllPrimaryCols = false; break; } } if (selectedColsContainAllPrimaryCols) { mainColsAreUnique = true; } else { mainColsAreUnique = ColumnsAreUnique(mainColumns); } } // Check if the Realted columns are unique if (checkBoxForeignUnique.Checked) { relatedColsAreUnique = true; } else { List <Column> relatedColumns = GetRelatedColumns(); bool selectedColsContainAllPrimaryCols = RelatedTable.ColumnsInPrimaryKey.Count() > 0; foreach (var col in RelatedTable.ColumnsInPrimaryKey) { if (!relatedColumns.Contains(col)) { selectedColsContainAllPrimaryCols = false; break; } } if (selectedColsContainAllPrimaryCols) { relatedColsAreUnique = true; } else { relatedColsAreUnique = ColumnsAreUnique(relatedColumns); } } IKey mainTableKey = null; foreach (var key in MainTable.Keys) { if (MainColumnCombos.Count == key.Columns.Count) { bool keyMatches = true; foreach (var combo in MainColumnCombos) { if (!key.Columns.Contains((Column)((DisplayItem)combo.SelectedItem).Value)) { keyMatches = false; break; } } if (keyMatches) { // Key is found mainTableKey = key; break; } } } IKey relatedTableKey = null; foreach (var key in RelatedTable.Keys) { if (RelatedColumnCombos.Count == key.Columns.Count) { bool keyMatches = true; foreach (var combo in RelatedColumnCombos) { // Can't have two primary keys, but there might be a foreign key on the same columns, so skip for now. Otherwise we'll need to create a new foreign key anyway. if (!key.Columns.Contains((Column)((DisplayItem)combo.SelectedItem).Value) && !((mainTableKey != null && mainTableKey.Keytype == DatabaseKeyType.Primary) && key.Keytype == DatabaseKeyType.Primary)) { keyMatches = false; break; } } if (keyMatches) { // Key is found relatedTableKey = key; break; } } } if (mainTableKey != null && relatedTableKey != null) { // Both keys exist, so let's check whether this relationship already exists foreach (var relationship in MainTable.Relationships) { if ((relationship.PrimaryKey == mainTableKey && relationship.ForeignKey == relatedTableKey) || (relationship.PrimaryKey == relatedTableKey && relationship.ForeignKey == mainTableKey)) { MessageBox.Show(this, "This relationship already exists.", "Relationship exists", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } } } if (mainTableKey != null && relatedTableKey != null && (mainTableKey.Keytype == DatabaseKeyType.Primary && relatedTableKey.Keytype == DatabaseKeyType.Primary)) { // A relationship can't have two primary keys, so we'll need to create a new 'foreign-key' relatedTableKey = null; } RelatedTable = (Table)comboBoxForeignTable.SelectedItem; if (mainTableKey == null) { mainTableKey = new Key { Name = string.Format("FK_{0}_{1}", MainTable.Name, RelatedTable.Name).GetNextName(MainTable.Relationships.Select(r => r.Name).ToList()), IsUserDefined = true, Keytype = DatabaseKeyType.Foreign, Parent = MainTable, IsUnique = mainColsAreUnique }; foreach (Column column in GetMainColumns()) { mainTableKey.AddColumn(column.Name); } } if (relatedTableKey == null) { relatedTableKey = new Key { Name = string.Format("FK_{0}_{1}", RelatedTable.Name, MainTable.Name).GetNextName(RelatedTable.Relationships.Select(r => r.Name).ToList()), IsUserDefined = true, Keytype = DatabaseKeyType.Foreign, Parent = RelatedTable, IsUnique = relatedColsAreUnique }; foreach (Column column in GetRelatedColumns()) { relatedTableKey.AddColumn(column.Name); } } mainTableKey.ReferencedKey = relatedTableKey; relatedTableKey.ReferencedKey = mainTableKey; if (Relationship == null) { Relationship newRelationship = new RelationshipImpl(); newRelationship.Database = MainTable.Database; newRelationship.IsUserDefined = true; newRelationship.Schema = MainTable.Schema; if (relatedTableKey.Keytype == DatabaseKeyType.Primary) { newRelationship.AddThisTo(RelatedTable, MainTable); newRelationship.Name = string.Format("FK_NH_{0}_{1}", RelatedTable, MainTable).GetNextName(RelatedTable.Relationships.Select(r => r.Name).ToList()); //newRelationship.PrimaryCardinality = mainColsAreUnique ? ArchAngel.Interfaces.Cardinality.One : ArchAngel.Interfaces.Cardinality.Many; //newRelationship.ForeignCardinality = relatedColsAreUnique ? ArchAngel.Interfaces.Cardinality.One : ArchAngel.Interfaces.Cardinality.Many; newRelationship.ForeignCardinality = mainColsAreUnique ? ArchAngel.Interfaces.Cardinality.One : ArchAngel.Interfaces.Cardinality.Many; newRelationship.PrimaryCardinality = relatedColsAreUnique ? ArchAngel.Interfaces.Cardinality.One : ArchAngel.Interfaces.Cardinality.Many; newRelationship.PrimaryKey = relatedTableKey; newRelationship.ForeignKey = mainTableKey; if (!newRelationship.PrimaryTable.Keys.Contains(relatedTableKey)) { newRelationship.PrimaryTable.AddKey(relatedTableKey); } if (!newRelationship.ForeignTable.Keys.Contains(mainTableKey)) { newRelationship.ForeignTable.AddKey(mainTableKey); } } else { newRelationship.AddThisTo(MainTable, RelatedTable); newRelationship.Name = string.Format("FK_NH_{0}_{1}", MainTable, RelatedTable); //newRelationship.PrimaryCardinality = mainColsAreUnique ? ArchAngel.Interfaces.Cardinality.One : ArchAngel.Interfaces.Cardinality.Many; //newRelationship.ForeignCardinality = relatedColsAreUnique ? ArchAngel.Interfaces.Cardinality.One : ArchAngel.Interfaces.Cardinality.Many; newRelationship.ForeignCardinality = mainColsAreUnique ? ArchAngel.Interfaces.Cardinality.One : ArchAngel.Interfaces.Cardinality.Many; newRelationship.PrimaryCardinality = relatedColsAreUnique ? ArchAngel.Interfaces.Cardinality.One : ArchAngel.Interfaces.Cardinality.Many; newRelationship.PrimaryKey = mainTableKey; newRelationship.ForeignKey = relatedTableKey; if (!newRelationship.PrimaryTable.Keys.Contains(mainTableKey)) { newRelationship.PrimaryTable.AddKey(mainTableKey); } if (!newRelationship.ForeignTable.Keys.Contains(relatedTableKey)) { newRelationship.ForeignTable.AddKey(relatedTableKey); } } //MainTable.Database.AddRelationship(newRelationship); OneToOneEntityProcessor proc = new OneToOneEntityProcessor(MainTable.Database.MappingSet.EntitySet.Entities.Select(e => e.Name)); //List<ITable> tables = new List<ITable>(); //tables.Add((ITable)MainTable); //proc.CreateOneToOneMappingsFor(tables, MainTable.Database.MappingSet); //proc.CreateReference(newRelationship, MainTable.Database.MappingSet.EntitySet); MappingProcessor.ProcessRelationshipInternal(MainTable.Database.MappingSet, newRelationship, proc); if (RelationshipAdded != null) { RelationshipAdded(null, null); } } this.Visible = false; }