Example #1
0
        protected override void LoadConstraints(Database schema, SchemaName schemaName, IDbConnection conn, NameFormat nameFormat, Names names)
        {
            //TableSorter.Sort(tables, constraints); //sort tables - parents first

            var constraints = ReadConstraints(conn, schemaName.DbName);

            var allKeys2    = ReadForeignConstraints(conn, schemaName.DbName);
            var foreignKeys = allKeys2.Where(k => k.ConstraintType == "FOREIGN KEY").ToList();
            var primaryKeys = allKeys2.Where(k => k.ConstraintType == "PRIMARY KEY").ToList();


            foreach (DataConstraint keyColRow in constraints)
            {
                //find my table:
                string constraintFullDbName    = GetFullDbName(keyColRow.TableName, keyColRow.TableSchema);
                DbLinq.Schema.Dbml.Table table = schema.Tables.FirstOrDefault(t => constraintFullDbName == t.Name);
                if (table == null)
                {
                    WriteErrorLine("ERROR L138: Table '" + keyColRow.TableName + "' not found for column " + keyColRow.ColumnName);
                    continue;
                }

                //todo: must understand better how PKEYs are encoded.
                //In Sasha's DB, they don't end with "_pkey", you need to rely on ReadForeignConstraints().
                //In Northwind, they do end with "_pkey".
                bool isPrimaryKey = keyColRow.ConstraintName.EndsWith("_pkey") ||
                                    primaryKeys.Count(k => k.ConstraintName == keyColRow.ConstraintName) == 1;

                if (isPrimaryKey)
                {
                    //A) add primary key
                    DbLinq.Schema.Dbml.Column primaryKeyCol = table.Type.Columns.First(c => c.Name == keyColRow.ColumnName);
                    primaryKeyCol.IsPrimaryKey = true;
                }
                else
                {
                    DataForeignConstraint dataForeignConstraint = foreignKeys.FirstOrDefault(f => f.ConstraintName == keyColRow.ConstraintName);

                    if (dataForeignConstraint == null)
                    {
                        string msg = "Missing data from 'constraint_column_usage' for foreign key " + keyColRow.ConstraintName;
                        WriteErrorLine(msg);
                        //throw new ApplicationException(msg);
                        continue; //as per Andrus, do not throw. //putting together an Adnrus_DB test case.
                    }

                    LoadForeignKey(schema, table, keyColRow.ColumnName, keyColRow.TableName, keyColRow.TableSchema,
                                   dataForeignConstraint.ColumnName, dataForeignConstraint.ReferencedTableName,
                                   dataForeignConstraint.ReferencedTableSchema,
                                   keyColRow.ConstraintName, nameFormat, names);
                }
            }
        }
 protected virtual DataForeignConstraint ReadForeignConstraint(IDataReader rdr)
 {
     var t = new DataForeignConstraint();
     int field = 0;
     t.ConstraintName = rdr.GetAsString(field++);
     t.TableName = rdr.GetAsString(field++);
     t.ConstraintType = rdr.GetAsString(field++);
     t.ReferencedTableSchema = rdr.GetAsString(field++);
     t.ReferencedTableName = rdr.GetAsString(field++);
     t.ColumnName = rdr.GetAsString(field++);
     return t;
 }
Example #3
0
        protected virtual DataForeignConstraint ReadForeignConstraint(IDataReader rdr)
        {
            var t     = new DataForeignConstraint();
            int field = 0;

            t.ConstraintName        = rdr.GetAsString(field++);
            t.TableName             = rdr.GetAsString(field++);
            t.ConstraintType        = rdr.GetAsString(field++);
            t.ReferencedTableSchema = rdr.GetAsString(field++);
            t.ReferencedTableName   = rdr.GetAsString(field++);
            t.ColumnName            = rdr.GetAsString(field++);
            return(t);
        }