public DBTableSchema() { Columns = new DBColumnSchema[0]; ForeignKeys = new DBForeignKeySchema[0]; UniqueConstraints = new DBUniqueConstraintSchema[0]; PrimaryKeyColumns = new DBColumnSchema[0]; BlobColumns = new DBColumnSchema[0]; }
private DBKeyRoot FindKeyRootRecursively(DBTableSchema table, DBColumnSchema keyColumn) { if (!(keyColumn.IsPrimaryKey || keyColumn.IsForeignKey || keyColumn.IsUnique)) { throw new ArgumentException("Column is not a key", "keyColumn"); } if ((keyColumn.IsPrimaryKey || keyColumn.IsUnique) && !keyColumn.IsForeignKey) { return new DBKeyRoot { RootColumn = keyColumn.Name, RootTable = table.Name, IsAutoIncrement = keyColumn.IsAutoIncrement, UsesSequence = keyColumn.UsesSequence } } ; Debug.Assert(keyColumn.IsForeignKey); // Since this is not a root primary key, recursively call the linked to primary key foreach (var foreignKey in table.ForeignKeys) { for (int i = 0; i < foreignKey.ForeignKeyColumns.Length; i++) { if (foreignKey.ForeignKeyColumns[i] == keyColumn.Name) { var tableName = foreignKey.ReferenceTable; var columnName = foreignKey.ReferenceColumns[i]; var pkTable = this[tableName]; var pkColumn = pkTable.GetColumn(columnName); // If it's a foreign key to itself (stupid but possible), then it is the root if (table.Name == pkTable.Name && keyColumn.Name == pkColumn.Name) { return new DBKeyRoot { RootColumn = keyColumn.Name, RootTable = table.Name, IsAutoIncrement = keyColumn.IsAutoIncrement, UsesSequence = keyColumn.UsesSequence } } ; return(FindKeyRootRecursively(pkTable, pkColumn)); } } } throw new Exception(string.Format("Unable to find key root for {0}.{1}", table.Name, keyColumn.Name)); }
public IEnumerable <Tuple <DBColumnSchema, DBColumnSchema> > GetColumnBindings(IEnumerable <DBColumnSchema> columns) { var bindings = new List <Tuple <DBColumnSchema, DBColumnSchema> >(); foreach (var column in columns) { DBColumnSchema reference = null; var foreignKeysInvolvingColumn = ForeignKeys.Where(fk => column.Name.IsIn(fk.ForeignKeyColumns)); if (foreignKeysInvolvingColumn.Any()) { var foreignKey = foreignKeysInvolvingColumn.Single(); int index = foreignKey.ForeignKeyColumns.IndexOf(column.Name); var referenceColumnName = foreignKey.ReferenceColumns[index]; var referenceTable = this.Owner[foreignKey.ReferenceTable]; reference = referenceTable[referenceColumnName]; } bindings.Add(Tuple.Create(column, reference)); } return(bindings); }