示例#1
0
        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);
        }