FluentMigrator.SchemaDump.SchemaDumpers.SqlServerSchemaDumper.ReadForeignKeys C# (CSharp) Method

ReadForeignKeys() protected method

protected ReadForeignKeys ( string schemaName, string tableName ) : IList
schemaName string
tableName string
return IList
        protected virtual IList<ForeignKeyDefinition> ReadForeignKeys(string schemaName, string tableName)
        {
            const string query = @"SELECT C.CONSTRAINT_SCHEMA AS Contraint_Schema,
                    C.CONSTRAINT_NAME AS Constraint_Name,
                    FK.CONSTRAINT_SCHEMA AS ForeignTableSchema,
                    FK.TABLE_NAME AS FK_Table,
                    CU.COLUMN_NAME AS FK_Column,
                    PK.CONSTRAINT_SCHEMA as PrimaryTableSchema,
                    PK.TABLE_NAME AS PK_Table,
                    PT.COLUMN_NAME AS PK_Column
                FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
                INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
                INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
                INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
                INNER JOIN (
                SELECT i1.TABLE_NAME, i2.COLUMN_NAME
                FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
                INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
                WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY'
                ) PT ON PT.TABLE_NAME = PK.TABLE_NAME
                WHERE PK.TABLE_NAME = '{1}'
                AND PK.CONSTRAINT_SCHEMA = '{0}'
                ORDER BY Constraint_Name";
            DataSet ds = Read(query, schemaName, tableName);
            DataTable dt = ds.Tables[0];
            IList<ForeignKeyDefinition> keys = new List<ForeignKeyDefinition>();

            foreach (DataRow dr in dt.Rows)
            {
                List<ForeignKeyDefinition> matches = (from i in keys
                                                      where i.Name == dr["Constraint_Name"].ToString()
                                                      select i).ToList();

                ForeignKeyDefinition d = null;
                if (matches.Count > 0) d = matches[0];

                // create the table if not found
                if (d == null)
                {
                    d = new ForeignKeyDefinition
                            {
                        Name = dr["Constraint_Name"].ToString(),
                        ForeignTableSchema = dr["ForeignTableSchema"].ToString(),
                        ForeignTable = dr["FK_Table"].ToString(),
                        PrimaryTable = dr["PK_Table"].ToString(),
                        PrimaryTableSchema = dr["PrimaryTableSchema"].ToString()
                    };
                    keys.Add(d);
                }

                // Foreign Columns
                ICollection<string> ms = (from m in d.ForeignColumns
                                  where m == dr["FK_Table"].ToString()
                                  select m).ToList();
                if (ms.Count == 0) d.ForeignColumns.Add(dr["FK_Table"].ToString());

                // Primary Columns
                ms = (from m in d.PrimaryColumns
                      where m == dr["PK_Table"].ToString()
                      select m).ToList();
                if (ms.Count == 0) d.PrimaryColumns.Add(dr["PK_Table"].ToString());
            }

            return keys;
        }