Esempio n. 1
0
        public DataEnumerator(DataTable table)
        {
            this.Disposed = false;
            lock (_masterLock)
            {
                if (!_tableQueuedEnumerators.Any(kv => TableID.TableEquals(kv.Key, table)))
                {
                    _tableQueuedEnumerators.Enqueue(new KeyValuePair <DataTable, List <DataEnumerator> >(table, new List <DataEnumerator>()
                    {
                        this
                    }));

                    if (masterThread == null)
                    {
                        masterThread = new Thread(DoWork);
                        masterThread.Start();
                    }
                    NextTable.Release();
                }
                else
                {
                    _tableQueuedEnumerators.First(kv => TableID.TableEquals(table, kv.Key)).Value.Add(this);
                }
            }
        }
        public override bool SkipTable(Table table)
        {
            //There must be exactly two FKs
            if (table.ForeignKeys.Count != 2)
            {
                return(true);
            }
            //The foreign keys must point to two different tables
            if (TableID.TableEquals(table.ForeignKeys[0].PKTable, table.ForeignKeys[1].PKTable))
            {
                return(true);
            }

            if (table.PrimaryKey == null)
            {
                return(true);
            }
            //Both foreignkeys must be part of PK
            var fkColums = (from fk in table.ForeignKeys
                            from colPair in fk.ColumnPairs
                            select colPair.FKColumn);

            if (!fkColums.All(c => table.PrimaryKey.Columns.Contains(c)))
            {
                return(true);
            }

            return(false);
        }
        public override void Execute(Database database, IIssueCollector issueCollector, IProviderCollection providers)
        {
            foreach (var table in database.Tables.Where(t => t.ForeignKeys.Count > 0 && t.PrimaryKey != null))
            {
                foreach (var fk in table.ForeignKeys.Where(fk => TableID.TableEquals(fk.PKTable, fk.FKTable)))
                {
                    bool isContained = true;
                    foreach (var pair in fk.ColumnPairs)
                    {
                        if (!table.PrimaryKey.Columns.Contains(pair.FKColumn))
                        {
                            isContained = false;
                        }
                    }

                    if (isContained)
                    {
                        issueCollector.ReportIssue(new Issue(this, DefaultSeverity.Value)
                        {
                            Name                = this.Name,
                            Context             = new TableContext(table),
                            Description         = new Description("The primary key '{0}' in table '{1}' references itself", table.PrimaryKey.PrimaryKeyName, table),
                            ExtendedDescription = new Description("Having a self-referencing primary key is likely not what is intended."),
                        });
                    }
                }
            }
        }