Esempio n. 1
0
        /// <summary>
        /// Get matching From ForeignKeyName according to To ForeignKeyName.
        /// </summary>
        /// <param name="parentType">Parent relationship detail.</param>
        /// <param name="toForeignKeyName">To ForeignKeyName.</param>
        /// <returns></returns>
        private string GetMatchingFromForeignKeyName(RelationshipDetail parentType, string toForeignKeyName)
        {
            if (parentType == null || string.IsNullOrEmpty(toForeignKeyName))
            {
                return(string.Empty);
            }

            for (int i = 0; i < parentType.ToDetails.Keys.Count; i++)
            {
                var foreignKeyAtIndex = parentType.ToDetails.Keys.ElementAt(i);
                if (string.Equals(foreignKeyAtIndex, toForeignKeyName, StringComparison.Ordinal))
                {
                    return(parentType.FromDetails.Keys.ElementAt(i));
                }
            }

            return(string.Empty);
        }
Esempio n. 2
0
        private int LoadPostgres(string connectionString, List <SpecialField> auditFields)
        {
            var tlist = DslPackage.Objects.Postgres.ImportDomain.GetTables(connectionString);
            var db    = new DataImport.Database();

            this.NewDatabase = db;

            var allIndexes   = DslPackage.Objects.Postgres.ImportDomain.GetIndexes(connectionString);
            var allRelations = DslPackage.Objects.Postgres.ImportDomain.GetRelations(connectionString);

            foreach (var entity in tlist)
            {
                //Create table
                var newEntity = new DataImport.Entity
                {
                    AllowCreateAudit = entity.Columns.Any(x => x.ColumnName == _model.CreatedByColumnName),
                    AllowModifyAudit = entity.Columns.Any(x => x.ColumnName == _model.ModifiedByColumnName),
                    AllowTimestamp   = entity.Columns.Any(x => x.ColumnName == _model.ConcurrencyCheckColumnName),
                    IsTenant         = entity.Columns.Any(x => x.ColumnName == _model.TenantColumnName),
                    Name             = entity.TableName,
                    Schema           = entity.SchemaName,
                };
                db.EntityList.Add(newEntity);

                //Load fields
                foreach (var column in entity.Columns)
                {
                    var isIndexed = allIndexes.Any(x => x.TableName == newEntity.Name && newEntity.FieldList.Any(z => z.Name == column.ColumnName) && newEntity.FieldList.Count == 1);
                    newEntity.FieldList.Add(new DataImport.Field
                    {
                        DataType   = SqlDbType.BigInt,
                        Identity   = column.IsIdentity,
                        IsIndexed  = isIndexed,
                        Name       = column.ColumnName,
                        Nullable   = column.AllowNull,
                        PrimaryKey = false,
                    });
                }

                //TODO: Add multi-column indexes

                #region Load relations

                foreach (var rowRelationship in allRelations)
                {
                    var constraintName  = rowRelationship.IndexName;
                    var parentTableName = rowRelationship.TableName;
                    var childTableName  = rowRelationship.FKTableName;
                    var parentTable     = db.EntityList.FirstOrDefault(x => x.Name == parentTableName);
                    var childTable      = db.EntityList.FirstOrDefault(x => x.Name == childTableName);
                    if (parentTable != null && childTable != null)
                    {
                        Relationship newRelation = null;
                        var          isAdd       = false;
                        if (db.RelationshipList.Count(x => x.ConstraintName == constraintName) == 0)
                        {
                            newRelation = new Relationship();
                            //if (rowRelationship["object_id"] != System.DBNull.Value)
                            //    newRelation.ImportData = rowRelationship["object_id"].ToString();
                            newRelation.SourceEntity   = parentTable;
                            newRelation.TargetEntity   = childTable;
                            newRelation.ConstraintName = constraintName;
                            var search   = ("_" + childTable.Name + "_" + parentTable.Name).ToLower();
                            var roleName = constraintName.ToLower().Replace(search, string.Empty);
                            if (roleName.Length >= 3)
                            {
                                roleName = roleName.Remove(0, 3);
                            }
                            var v = roleName.ToLower();
                            if (v != "fk")
                            {
                                newRelation.RoleName = v;
                            }
                            isAdd = true;
                        }
                        else
                        {
                            newRelation = db.RelationshipList.First(x => x.ConstraintName == constraintName);
                        }

                        //add the column relationship to the relation
                        var columnRelationship = new RelationshipDetail();
                        var parentColumnName   = rowRelationship.ColumnName;
                        var childColumnName    = rowRelationship.FKColumnName;
                        if (parentTable.FieldList.Count(x => x.Name == parentColumnName) == 1 && (childTable.FieldList.Count(x => x.Name == childColumnName) == 1))
                        {
                            columnRelationship.ParentField = parentTable.FieldList.First(x => x.Name == parentColumnName);
                            columnRelationship.ChildField  = childTable.FieldList.First(x => x.Name == childColumnName);
                            newRelation.RelationshipColumnList.Add(columnRelationship);

                            //ONLY ADD THIS RELATION IF ALL WENT WELL
                            if (isAdd)
                            {
                                parentTable.RelationshipList.Add(newRelation);
                            }
                        }
                    }
                }
                #endregion

                this.NewDatabase.CleanUp();
                this.NewDatabase.SetupIdMap(this.CurrentDatabase);

                //Load the tree
                this.Populate();
            }

            return(0);
        }
Esempio n. 3
0
        public Database Import(string connectionString, IEnumerable <SpecialField> auditFields)
        {
            try
            {
                var database = new Database();

                #region Load user defined types
                LoadUdts(database, connectionString);
                #endregion

                #region Load Entities
                this.ProgressText = "Loading Entities...";
                using (var tableReader = DatabaseHelper.ExecuteReader(connectionString, CommandType.Text, SchemaModelHelper.GetSqlDatabaseTables()))
                {
                    while (tableReader.Read())
                    {
                        var newEntity = new Entity();
                        newEntity.Name = tableReader["name"].ToString();
                        database.EntityList.Add(newEntity);
                        newEntity.Schema = tableReader["schema"].ToString();
                    }
                }
                #endregion

                #region Load Entity Fields
                using (var columnReader = DatabaseHelper.ExecuteReader(connectionString, CommandType.Text, SchemaModelHelper.GetSqlColumnsForTable()))
                {
                    while (columnReader.Read())
                    {
                        var columnName = columnReader["columnName"].ToString();
                        var tableName  = columnReader["tableName"].ToString();

                        var entity = database.EntityList.FirstOrDefault(x => x.Name == tableName);
                        //Ensure the field name is not an Audit field
                        if (entity != null && !auditFields.Any(x => x.Name.Match(columnName)))
                        {
                            var maxSortOrder = 0;
                            if (entity.FieldList.Count > 0)
                            {
                                maxSortOrder = entity.FieldList.Max(x => x.SortOrder);
                            }
                            var newColumn = new Field()
                            {
                                Name = columnName, SortOrder = ++maxSortOrder
                            };
                            entity.FieldList.Add(newColumn);

                            newColumn.Nullable = (int)columnReader["allow_null"] == 1;
                            if ((int)columnReader["is_identity"] == 1)
                            {
                                newColumn.Identity = true;
                            }

                            if (columnReader["isPrimaryKey"] != System.DBNull.Value)
                            {
                                newColumn.PrimaryKey = true;
                            }

                            try
                            {
                                newColumn.DataType = DatabaseHelper.GetSQLDataType(columnReader["system_type_id"].ToString(), database.UserDefinedTypes);
                            }
                            catch { }

                            var defaultvalue = columnReader["default_value"].ToString();
                            SetupDefault(newColumn, defaultvalue);
                            //newColumn.ImportedDefaultName = "";

                            newColumn.Length = (int)columnReader["max_length"];

                            //Decimals are a little different
                            if (newColumn.DataType == SqlDbType.Decimal)
                            {
                                newColumn.Length = (byte)columnReader["precision"];
                                newColumn.Scale  = (int)columnReader["scale"];
                            }
                        }
                        else if (entity != null)
                        {
                            if (auditFields.Any(x => (x.Type == SpecialFieldTypeConstants.CreatedDate ||
                                                      x.Type == SpecialFieldTypeConstants.CreatedBy) &&
                                                x.Name.ToLower() == columnName.ToLower()))
                            {
                                entity.AllowCreateAudit = true;
                            }

                            if (auditFields.Any(x => (x.Type == SpecialFieldTypeConstants.ModifiedDate ||
                                                      x.Type == SpecialFieldTypeConstants.ModifiedBy) &&
                                                x.Name.ToLower() == columnName.ToLower()))
                            {
                                entity.AllowModifyAudit = true;
                            }

                            if (auditFields.Any(x => x.Type == SpecialFieldTypeConstants.Timestamp &&
                                                x.Name.ToLower() == columnName.ToLower()))
                            {
                                entity.AllowTimestamp = true;
                            }

                            if (auditFields.Any(x => x.Type == SpecialFieldTypeConstants.Tenant &&
                                                x.Name.ToLower() == columnName.ToLower()))
                            {
                                entity.IsTenant = true;
                            }
                        }
                    }
                }

                using (var columnReader = DatabaseHelper.ExecuteReader(connectionString, CommandType.Text, SchemaModelHelper.GetSqlColumnsForComputed()))
                {
                    while (columnReader.Read())
                    {
                        var tableName  = columnReader["tableName"].ToString();
                        var columnName = columnReader["columnName"].ToString();
                        var entity     = database.EntityList.FirstOrDefault(x => x.Name == tableName);
                        if (entity != null)
                        {
                            var column = entity.FieldList.FirstOrDefault(x => x.Name.ToLower() == columnName.ToLower());
                            if (column != null)
                            {
                                column.IsComputed = true;
                                column.Formula    = columnReader["definition"].ToString();
                            }
                        }
                    }
                }

                #endregion

                #region Load Entity Indexes
                using (var indexReader = DatabaseHelper.ExecuteReader(connectionString, CommandType.Text, SchemaModelHelper.GetSqlIndexesForTable()))
                {
                    while (indexReader.Read())
                    {
                        var indexName  = indexReader["indexname"].ToString();
                        var columnName = indexReader["columnname"].ToString();
                        var tableName  = indexReader["tableName"].ToString();
                        var entity     = database.EntityList.FirstOrDefault(x => x.Name == tableName);
                        if (entity != null)
                        {
                            var pk     = bool.Parse(indexReader["is_primary_key"].ToString());
                            var column = entity.FieldList.FirstOrDefault(x => x.Name == columnName);
                            if (column != null && !pk)
                            {
                                column.IsIndexed = true;
                            }
                        }
                    }
                }
                #endregion

                #region Load Relations

                var dsRelationship = DatabaseHelper.ExecuteDataset(connectionString, SchemaModelHelper.GetSqlForRelationships());
                foreach (DataRow rowRelationship in dsRelationship.Tables[0].Rows)
                {
                    var constraintName  = rowRelationship["FK_CONSTRAINT_NAME"].ToString();
                    var parentTableName = (string)rowRelationship["UQ_TABLE_NAME"];
                    var childTableName  = (string)rowRelationship["FK_TABLE_NAME"];
                    var parentTable     = database.EntityList.FirstOrDefault(x => x.Name == parentTableName);
                    var childTable      = database.EntityList.FirstOrDefault(x => x.Name == childTableName);
                    if (parentTable != null && childTable != null)
                    {
                        Relationship newRelation = null;
                        var          isAdd       = false;
                        if (database.RelationshipList.Count(x => x.ConstraintName == constraintName) == 0)
                        {
                            newRelation = new Relationship();
                            if (rowRelationship["object_id"] != System.DBNull.Value)
                            {
                                newRelation.ImportData = rowRelationship["object_id"].ToString();
                            }
                            newRelation.SourceEntity   = parentTable;
                            newRelation.TargetEntity   = childTable;
                            newRelation.ConstraintName = constraintName;
                            var search   = ("_" + childTable.Name + "_" + parentTable.Name).ToLower();
                            var roleName = constraintName.ToLower().Replace(search, string.Empty);
                            if (roleName.Length >= 3)
                            {
                                roleName = roleName.Remove(0, 3);
                            }
                            var v = roleName.ToLower();
                            if (v != "fk")
                            {
                                newRelation.RoleName = v;
                            }
                            isAdd = true;
                        }
                        else
                        {
                            newRelation = database.RelationshipList.First(x => x.ConstraintName == constraintName);
                        }

                        //add the column relationship to the relation
                        var columnRelationship = new RelationshipDetail();
                        var parentColumnName   = (string)rowRelationship["UQ_COLUMN_NAME"];
                        var childColumnName    = (string)rowRelationship["FK_COLUMN_NAME"];
                        if (parentTable.FieldList.Count(x => x.Name == parentColumnName) == 1 && (childTable.FieldList.Count(x => x.Name == childColumnName) == 1))
                        {
                            columnRelationship.ParentField = parentTable.FieldList.First(x => x.Name == parentColumnName);
                            columnRelationship.ChildField  = childTable.FieldList.First(x => x.Name == childColumnName);
                            newRelation.RelationshipColumnList.Add(columnRelationship);

                            //ONLY ADD THIS RELATION IF ALL WENT WELL
                            if (isAdd)
                            {
                                parentTable.RelationshipList.Add(newRelation);
                            }
                        }
                        else
                        {
                            System.Diagnostics.Debug.Write(string.Empty);
                        }
                    }
                }
                #endregion

                #region Load Views
                this.ProgressText = "Loading Views...";
                LoadViews(database, connectionString);

                #endregion

                #region Load Indexes

                this.ProgressText = "Loading Indexes...";
                LoadIndexes(database, connectionString);

                #endregion

                LoadUniqueFields(database, connectionString);

                return(database);
            }
            catch (Exception ex /*ignored*/)
            {
                throw;
            }
            finally
            {
                this.ProgressText  = string.Empty;
                this.ProgressValue = 0;
            }
        }
Esempio n. 4
0
        /// <summary>
        /// Get the the origin class which this foreign key refers to.
        /// </summary>
        /// <exception cref="ArgumentNullException">
        /// When foreignKeyName is null.
        /// </exception>
        /// <param name="foreignKeyName">Name of foreign key property.</param>
        /// <returns>Name of class which this foreign key refers to.</returns>
        public string GetOriginOfForeignKey(string foreignKeyName)
        {
            if (string.IsNullOrEmpty(foreignKeyName))
            {
                throw new ArgumentNullException(nameof(foreignKeyName));
            }

            // Try to get from store
            Tuple <string, string> key = new Tuple <string, string>(EntityTypeName, foreignKeyName);

            if (Store.ForeignKeyOrigin.ContainsKey(key))
            {
                return(Store.ForeignKeyOrigin[key]);
            }

            string originOfForeignKey = string.Empty;

            // Principal relationship multiplicities
            List <RelationshipMultiplicity> principalRelationshipMultiplicity =
                new List <RelationshipMultiplicity>()
            {
                RelationshipMultiplicity.One,
                RelationshipMultiplicity.ZeroOrOne
            };

            // Get the relationship detail which this foreign keys refers.
            RelationshipDetail parentType = GetForeignKeyDetails()
                                            .Where(r => r.ToDetails.ContainerClass.Equals(EntityTypeName) &&
                                                   r.ToDetails.Keys.Any(k => k.Equals(foreignKeyName)) &&
                                                   r.FromDetails != null &&
                                                   !string.IsNullOrEmpty(r.FromDetails.ContainerClass) &&
                                                   principalRelationshipMultiplicity
                                                   .Contains(r.FromDetails.RelationshipMultiplicity))
                                            .FirstOrDefault();

            if (parentType != null)
            {
                var currentReferencedTypeName = parentType.FromDetails.ContainerClass;
                var currentForeignKeyName     = GetMatchingFromForeignKeyName(parentType, foreignKeyName);
                while (!string.IsNullOrEmpty(currentReferencedTypeName))
                {
                    // If EntityTypeName and currentReferencedTypeName is same,
                    // then this is self reference, so we need to break infinete iteration.
                    if (EntityTypeName == currentReferencedTypeName)
                    {
                        break;
                    }

                    IGraphEntityTypeManager referencedTypeManager = ContextFactory
                                                                    .GetEntityTypeManager(currentReferencedTypeName);

                    // Get one-to-one principal parent relationship detail,
                    // because the origin of foreign key is uppermost principal parent.
                    RelationshipDetail principalParent = referencedTypeManager
                                                         .GetForeignKeyDetails()
                                                         .Where(r => r.ToDetails.ContainerClass.Equals(currentReferencedTypeName) &&
                                                                r.ToDetails.Keys.Contains(currentForeignKeyName) &&
                                                                r.FromDetails != null &&
                                                                !string.IsNullOrEmpty(r.FromDetails.ContainerClass) &&
                                                                principalRelationshipMultiplicity
                                                                .Contains(r.FromDetails.RelationshipMultiplicity))
                                                         .FirstOrDefault();

                    if (principalParent != null)
                    {
                        // If principal parent is not null set current to this.
                        currentReferencedTypeName = principalParent.FromDetails.ContainerClass;
                        currentForeignKeyName     = GetMatchingFromForeignKeyName(principalParent, currentForeignKeyName);
                    }
                    else
                    {
                        // If principal parent is null exit the iteration.
                        break;
                    }
                }

                originOfForeignKey = currentReferencedTypeName;
            }

            // Add to store
            Store.ForeignKeyOrigin.Add(key, originOfForeignKey);
            return(originOfForeignKey);
        }
Esempio n. 5
0
        public Database Import(string connectionString, IEnumerable<SpecialField> auditFields)
        {
            try
            {
                var database = new Database();
                database.Collate = DatabaseHelper.GetDatabaseCollation(connectionString);

                #region Load user defined types
                LoadUdts(database, connectionString);
                #endregion

                #region Load Entities
                this.ProgressText = "Loading Entities...";
                using (var tableReader = DatabaseHelper.ExecuteReader(connectionString, CommandType.Text, SchemaModelHelper.GetSqlDatabaseTables()))
                {
                    while (tableReader.Read())
                    {
                        var newEntity = new Entity();
                        newEntity.Name = tableReader["name"].ToString();
                        database.EntityList.Add(newEntity);
                        newEntity.Schema = tableReader["schema"].ToString();
                    }
                }
                #endregion

                #region Load Entity Fields
                using (var columnReader = DatabaseHelper.ExecuteReader(connectionString, CommandType.Text, SchemaModelHelper.GetSqlColumnsForTable()))
                {
                    while (columnReader.Read())
                    {
                        var columnName = columnReader["columnName"].ToString();
                        var tableName = columnReader["tableName"].ToString();

                        var entity = database.EntityList.FirstOrDefault(x => x.Name == tableName);
                        //Ensure the field name is not an Audit field
                        if (entity != null && !auditFields.Any(x => x.Name.ToLower() == columnName.ToLower()))
                        {
                            var maxSortOrder = 0;
                            if (entity.FieldList.Count > 0) maxSortOrder = entity.FieldList.Max(x => x.SortOrder);
                            var newColumn = new Field() { Name = columnName, SortOrder = ++maxSortOrder };
                            entity.FieldList.Add(newColumn);

                            newColumn.Nullable = bool.Parse(columnReader["allowNull"].ToString());
                            if (bool.Parse(columnReader["isIdentity"].ToString()))
                                newColumn.Identity = true;

                            if (columnReader["isPrimaryKey"] != System.DBNull.Value)
                                newColumn.PrimaryKey = true;

                            try
                            {
                                newColumn.DataType = DatabaseHelper.GetSQLDataType(columnReader["xtype"].ToString(), database.UserDefinedTypes);
                            }
                            catch { }

                            var defaultvalue = columnReader["defaultValue"].ToString();
                            SetupDefault(newColumn, defaultvalue);
                            //newColumn.ImportedDefaultName = "";

                            newColumn.Length = (int)columnReader["length"];

                            //Decimals are a little different
                            if (newColumn.DataType == SqlDbType.Decimal)
                            {
                                newColumn.Length = (byte)columnReader["precision"];
                                newColumn.Scale = (int)columnReader["scale"];
                            }

                            if (columnReader["collation"] != System.DBNull.Value)
                            {
                                if (database.Collate != (string)columnReader["collation"])
                                    newColumn.Collate = (string)columnReader["collation"];
                            }

                        }
                        else if (entity != null)
                        {
                            if (auditFields.Any(x => (x.Type == SpecialFieldTypeConstants.CreatedDate ||
                                x.Type == SpecialFieldTypeConstants.CreatedBy) &&
                                x.Name.ToLower() == columnName.ToLower()))
                            {
                                entity.AllowCreateAudit = true;
                            }

                            if (auditFields.Any(x => (x.Type == SpecialFieldTypeConstants.ModifedDate ||
                                x.Type == SpecialFieldTypeConstants.ModifiedBy) &&
                                x.Name.ToLower() == columnName.ToLower()))
                            {
                                entity.AllowModifyAudit = true;
                            }

                            if (auditFields.Any(x => x.Type == SpecialFieldTypeConstants.Timestamp &&
                                x.Name.ToLower() == columnName.ToLower()))
                            {
                                entity.AllowTimestamp = true;
                            }

                            if (auditFields.Any(x => x.Type == SpecialFieldTypeConstants.Tenant &&
                                x.Name.ToLower() == columnName.ToLower()))
                            {
                                entity.IsTenant = true;
                            }
                        }
                    }
                }

                using (var columnReader = DatabaseHelper.ExecuteReader(connectionString, CommandType.Text, SchemaModelHelper.GetSqlColumnsForComputed()))
                {
                    while (columnReader.Read())
                    {
                        var tableName = columnReader["tableName"].ToString();
                        var columnName = columnReader["columnName"].ToString();
                        var entity = database.EntityList.FirstOrDefault(x => x.Name == tableName);
                        if (entity != null)
                        {
                            var column = entity.FieldList.FirstOrDefault(x => x.Name.ToLower() == columnName.ToLower());
                            if (column != null)
                            {
                                column.IsComputed = true;
                                column.Formula = columnReader["definition"].ToString();
                            }
                        }
                    }
                }

                #endregion

                #region Load Entity Indexes
                using (var indexReader = DatabaseHelper.ExecuteReader(connectionString, CommandType.Text, SchemaModelHelper.GetSqlIndexesForTable()))
                {
                    while (indexReader.Read())
                    {
                        var indexName = indexReader["indexname"].ToString();
                        var columnName = indexReader["columnname"].ToString();
                        var tableName = indexReader["tableName"].ToString();
                        var entity = database.EntityList.FirstOrDefault(x => x.Name == tableName);
                        if (entity != null)
                        {
                            var pk = bool.Parse(indexReader["is_primary_key"].ToString());
                            var column = entity.FieldList.FirstOrDefault(x => x.Name == columnName);
                            if (column != null && !pk)
                                column.IsIndexed = true;
                        }
                    }
                }
                #endregion

                #region Load Relations

                var dsRelationship = DatabaseHelper.ExecuteDataset(connectionString, SchemaModelHelper.GetSqlForRelationships());
                foreach (DataRow rowRelationship in dsRelationship.Tables[0].Rows)
                {
                    var constraintName = rowRelationship["FK_CONSTRAINT_NAME"].ToString();
                    var parentTableName = (string)rowRelationship["UQ_TABLE_NAME"];
                    var childTableName = (string)rowRelationship["FK_TABLE_NAME"];
                    var parentTable = database.EntityList.FirstOrDefault(x => x.Name == parentTableName);
                    var childTable = database.EntityList.FirstOrDefault(x => x.Name == childTableName);
                    if (parentTable != null && childTable != null)
                    {
                        Relationship newRelation = null;
                        var isAdd = false;
                        if (database.RelationshipList.Count(x => x.ConstraintName == constraintName) == 0)
                        {
                            newRelation = new Relationship();
                            if (rowRelationship["id"] != System.DBNull.Value)
                                newRelation.ImportData = rowRelationship["id"].ToString();
                            newRelation.SourceEntity = parentTable;
                            newRelation.TargetEntity = childTable;
                            newRelation.ConstraintName = constraintName;
                            var search = ("_" + childTable.Name + "_" + parentTable.Name).ToLower();
                            var roleName = constraintName.ToLower().Replace(search, string.Empty);
                            if (roleName.Length >= 3) roleName = roleName.Remove(0, 3);
                            var v = roleName.ToLower();
                            if (v != "fk") newRelation.RoleName = v;
                            isAdd = true;
                        }
                        else
                        {
                            newRelation = database.RelationshipList.First(x => x.ConstraintName == constraintName);
                        }

                        //add the column relationship to the relation
                        var columnRelationship = new RelationshipDetail();
                        var parentColumnName = (string)rowRelationship["UQ_COLUMN_NAME"];
                        var childColumnName = (string)rowRelationship["FK_COLUMN_NAME"];
                        if (parentTable.FieldList.Count(x => x.Name == parentColumnName) == 1 && (childTable.FieldList.Count(x => x.Name == childColumnName) == 1))
                        {
                            columnRelationship.ParentField = parentTable.FieldList.First(x => x.Name == parentColumnName);
                            columnRelationship.ChildField = childTable.FieldList.First(x => x.Name == childColumnName);
                            newRelation.RelationshipColumnList.Add(columnRelationship);

                            //ONLY ADD THIS RELATION IF ALL WENT WELL
                            if (isAdd)
                                parentTable.RelationshipList.Add(newRelation);
                        }
                        else
                        {
                            System.Diagnostics.Debug.Write(string.Empty);
                        }

                    }

                }
                #endregion

                #region Load StoredProcs

                LoadStoredProcedures(database, connectionString);

                #endregion

                #region Load Views
                this.ProgressText = "Loading Views...";
                LoadViews(database, connectionString);

                #endregion

                #region Load Functions

                this.ProgressText = "Loading Functions...";
                LoadFunctions(database, connectionString);

                #endregion

                #region Load Indexes

                this.ProgressText = "Loading Indexes...";
                LoadIndexes(database, connectionString);

                #endregion

                LoadUniqueFields(database, connectionString);

                return database;

            }
            catch (Exception /*ignored*/)
            {
                throw;
            }
            finally
            {
                this.ProgressText = string.Empty;
                this.ProgressValue = 0;
            }
        }