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."), }); } } } }