private static Key CreateForeignKey(MappingSet set, ITable primaryTable, ITable foreignTable)
        {
            var foreignKey = new Key(GetNextKeyName("FK_" + primaryTable.Name + "_" + foreignTable.Name, set), DatabaseKeyType.Foreign);
            var primaryKey = primaryTable.FirstPrimaryKey;
            foreignKey.ReferencedKey = primaryKey;
            foreignTable.AddKey(foreignKey);

            // Create the columns for the foreign keys
            foreach (var column in primaryKey.Columns)
            {
                var newColumn = CloneColumn(primaryTable, foreignTable, column, "Foreign_");
                foreignKey.AddColumn(newColumn.Name);
            }
            return foreignKey;
        }
        private void GetKeys(ITable table)
        {
            DataRow[] keyRows = connector.Indexes.Select(string.Format("TABLE_NAME = '{0}' AND TABLE_SCHEMA = '{1}'", table.Name.Replace("'", "''"), table.Schema));

            for (int i = 0; i < keyRows.Length; i++)
            {
                DataRow keyRow = keyRows[i];
                DatabaseKeyType keyType;
                string indexKeyType = keyRow["CONSTRAINT_TYPE"].ToString();

                if (indexKeyType == "PRIMARY KEY")
                {
                    keyType = DatabaseKeyType.Primary;
                }
                else if (indexKeyType == "UNIQUE")
                {
                    keyType = DatabaseKeyType.Unique;
                }
                else
                {
                    continue;
                }

                Key key = new Key
                {
                    Name = keyRow["INDEX_NAME"].ToString(),
                    IsUserDefined = false,
                    Keytype = keyType,
                    Parent = table,
                    IsUnique = true
                };

                // Fill Columns
                List<DataRow> keyColumnRows = new List<DataRow>();
                keyColumnRows.AddRange(connector.Columns.Select(string.Format("TABLE_NAME = '{0}' AND TABLE_SCHEMA = '{1}' AND COLUMN_NAME  = '{2}'", table.Name.Replace("'", "''"), table.Schema, keyRow["COLUMN_NAME"])));

                while ((i < keyRows.Length - 1) && (string)keyRows[i + 1]["TABLE_NAME"] == table.Name && (string)keyRows[i + 1]["INDEX_NAME"] == (string)keyRow["INDEX_NAME"])
                {
                    i++;
                    keyRow = keyRows[i];
                    keyColumnRows.AddRange(connector.Columns.Select(string.Format("TABLE_NAME = '{0}' AND TABLE_SCHEMA = '{1}' AND COLUMN_NAME  = '{2}'", table.Name.Replace("'", "''"), table.Schema, keyRow["COLUMN_NAME"])));
                }

                // Fill Columns
                foreach (DataRow keyColumnRow in keyColumnRows)
                {
                    key.AddColumn((string)keyColumnRow["COLUMN_NAME"]);
                }

                key.ResetDefaults();
                table.AddKey(key);
            }
        }
        private void GetKeys(ITable table)
        {
            List<DataRow> keyRows = connector.GetIndexRows(table.Schema, table.Name.Replace("'", "''"));

            for (int i = 0; i < keyRows.Count; i++)
            {
                DataRow keyRow = keyRows[i];
                DatabaseKeyType keyType;
                string indexKeyType = keyRow["CONSTRAINT_TYPE"].ToString();

                /*if (indexKeyType == "PRIMARY KEY")
                    keyType = DatabaseKeyType.Primary;
                else*/
                if (indexKeyType == "UNIQUE")
                    keyType = DatabaseKeyType.Unique;
                else
                    continue;

                Key key = new Key
                {
                    Name = keyRow["INDEX_NAME"].ToString(),
                    IsUserDefined = false,
                    Keytype = keyType,
                    Parent = table,
                    IsUnique = true
                };
                // Fill Columns
                List<DataRow> keyColumnRows = new List<DataRow>();

                keyColumnRows.AddRange(connector.ColumnsBySchema[table.Schema][table.Name.Replace("'", "''")].Where(r => r[OrdColumn].ToString() == keyRow["COLUMN_NAME"].ToString()));

                while ((i < keyRows.Count - 1) && (string)keyRows[i + 1]["TABLE_NAME"] == table.Name && (string)keyRows[i + 1]["INDEX_NAME"] == (string)keyRow["INDEX_NAME"])
                {
                    i++;
                    keyRow = keyRows[i];
                    keyColumnRows.AddRange(connector.ColumnsBySchema[table.Schema][table.Name.Replace("'", "''")].Where(c => c[OrdColumn].ToString() == keyRow["COLUMN_NAME"].ToString()));
                }

                // Fill Columns
                foreach (DataRow keyColumnRow in keyColumnRows)
                    key.AddColumn((string)keyColumnRow["COLUMN_NAME"]);

                key.ResetDefaults();
                table.AddKey(key);
            }
            // Add Primary Keys
            var primaryKeyNames = connector.PrimaryKeyNames;

            if (primaryKeyNames.ContainsKey(table.Schema) && primaryKeyNames[table.Schema].ContainsKey(table.Name))
            {
                Key key = new Key
                {
                    Name = primaryKeyNames[table.Schema][table.Name],
                    IsUserDefined = false,
                    Keytype = DatabaseKeyType.Primary,
                    Parent = table,
                    IsUnique = true
                };
                // Fill Columns
                foreach (var column in table.ColumnsInPrimaryKey)
                    key.AddColumn(column.Name);

                key.ResetDefaults();
                table.AddKey(key);
            }
        }