private static List <SchemaCheck> CheckSelfReferencingFk(SqlTable table) { var schemaChecks = new List <SchemaCheck>(); var selfReferencingFks = table.Properties.OfType <ForeignKey>().Where(fk => fk.SqlTable.SchemaAndTableName == fk.ReferredTable.SchemaAndTableName); foreach (var selfReferencingFkCandidate in selfReferencingFks) { var pk = selfReferencingFkCandidate.ReferredTable.Properties.OfType <PrimaryKey>().FirstOrDefault(); var uCs = selfReferencingFkCandidate.ReferredTable.Properties.OfType <UniqueConstraint>(); var areReferencedAndReferredColumnsTheSame = false; var sameUcCandidates = uCs.ToList(); foreach (var columnMap in selfReferencingFkCandidate.ForeignKeyColumns) { if (!areReferencedAndReferredColumnsTheSame && Comparer.ColumnChanged(columnMap.ForeignKeyColumn, columnMap.ReferredColumn)) { areReferencedAndReferredColumnsTheSame = true; continue; } foreach (var uc in uCs) { foreach (var ucColumn in uc.SqlColumns) { if (sameUcCandidates.Contains(uc) && !Comparer.ColumnChanged(columnMap.ReferredColumn, ucColumn.SqlColumn)) { sameUcCandidates.Remove(uc); } } } } if (areReferencedAndReferredColumnsTheSame) { var selfReferencingFk = new SelfReferencingFk() { ForeignKey = selfReferencingFkCandidate, }; // TODO if (sameUcCandidates.Skip(1).Any()) { throw new ApplicationException("sameUcCandidates should not countain more than 1 elment."); } var sameUcCandidate = sameUcCandidates.FirstOrDefault(); // should be only one selfReferencingFk.Comment = sameUcCandidate == null ? "PK" : "UC"; schemaChecks.Add(selfReferencingFk); } } return(schemaChecks); }