示例#1
0
        private void AppendJoinSource(StringBuilder joinClause, DbmsForeignKey foreignKey)
        {
            string            fkTableAlias = foreignKey.ForeignKeyBaseTable.LinkProperty.Alias;
            string            pkTableAlias = foreignKey.PrimaryUniqueKeyBaseTable.LinkProperty.Alias;
            List <DbmsColumn> fkColumns    = foreignKey.ForeignKeyColumns;
            List <DbmsColumn> pkColumns    = foreignKey.PrimaryUniqueKeyColumns;
            int  nCols       = foreignKey.ForeignKeyColumns.Count;
            bool parentheses = foreignKey.PrimaryUniqueKeyBaseTable.ForeignKeys.Count > 0;

            if (foreignKey.IsNullable)
            {
                joinClause.Append("LEFT JOIN");
            }
            else
            {
                joinClause.Append("INNER JOIN");
            }

            if (parentheses)
            {
                joinClause.AppendLine(" (");
            }
            else
            {
                joinClause.AppendLine();
            }

            joinClause.Append(BuildJoinClause(foreignKey.PrimaryUniqueKeyBaseTable).PushIndent());

            if (parentheses)
            {
                joinClause.Append(") ");
            }

            joinClause.Append("ON (");

            for (int i = 0; i < nCols; i++)
            {
                if (i > 0)
                {
                    joinClause.Append(" AND ");
                }

                joinClause.AppendFormat("{0}.{1} = {2}.{3}", fkTableAlias, fkColumns[i].ColumnName, pkTableAlias, pkColumns[i].ColumnName);
            }

            joinClause.AppendLine(")");
        }
示例#2
0
        public void AddForeignKeyColumn(string constraintName, string foreignKeyColumn, bool foreignKeyNullable,
                                        string referencedTable, string referencedColumn, bool referencedNullable, bool detectCycle = true)
        {
            DbmsForeignKey fk = _ForeignKeys.LastOrDefault(s => constraintName.Equals(s.ConstraintName, StringComparison.OrdinalIgnoreCase));

            if (fk == null)
            {
                if (detectCycle && _ParentForeignKey != null)
                {
                    if (_ParentForeignKey.DetectCycle(constraintName))
                    {
                        return;
                    }
                }

                fk = new DbmsForeignKey(constraintName, this, referencedTable);
                _ForeignKeys.Add(fk);
            }

            fk.AddForeignKeyColumn(new DbmsColumn(foreignKeyColumn, foreignKeyNullable), new DbmsColumn(referencedColumn, referencedNullable));
        }
示例#3
0
        public bool DetectCycle(string constraintName)                  // Call before the constraintName to be added into the tree
        {
            if (string.IsNullOrWhiteSpace(constraintName))
            {
                return(DetectLoopback());
            }

            DbmsRelationTree baseTable;

            for (DbmsForeignKey foreignKey = this; foreignKey != null; foreignKey = baseTable.ParentForeignKey)
            {
                if (constraintName.Equals(foreignKey.ConstraintName, System.StringComparison.OrdinalIgnoreCase))
                {
                    return(true);
                }
                else
                {
                    baseTable = foreignKey.ForeignKeyBaseTable;
                }
            }

            return(false);
        }
示例#4
0
 public DbmsRelationTree(string tableName, DbmsForeignKey parentForeignKey = null)
 {
     _NodeTableName    = _QualifiedName = tableName;
     _ParentForeignKey = parentForeignKey;
     _ForeignKeys      = new List <DbmsForeignKey>();
 }