private static Table ParseTable(Database database, information_schema information_Schema, TABLES dbTables) { var table = new Table(); table.Database = database; table.DbName = dbTables.TABLE_NAME; table.Type = dbTables.TABLE_TYPE == "BASE TABLE" ? TableType.Table : TableType.View; table.Model = new Model { CsTypeName = dbTables.TABLE_NAME }; table.Columns = information_Schema .COLUMNS.Where(x => x.TABLE_SCHEMA == database.Name && x.TABLE_NAME == table.DbName) .AsEnumerable() .Select(x => ParseColumn(table, x)) .ToList(); return(table); }
public static DatabaseMetadata ParseDatabase(string dbName, information_schema information_Schema) { var database = new DatabaseMetadata(dbName); database.Tables = information_Schema .TABLES.Where(x => x.TABLE_SCHEMA == dbName) .AsEnumerable() .Select(x => ParseTable(database, information_Schema, x)) .ToList(); foreach (var key in information_Schema .KEY_COLUMN_USAGE.Where(x => x.TABLE_SCHEMA == dbName && x.REFERENCED_COLUMN_NAME != null)) { var relation = new Relation { Constraint = key.CONSTRAINT_NAME, Type = RelationType.OneToMany }; var foreignKeyColumn = database .Tables.Single(x => x.DbName == key.TABLE_NAME) .Columns.Single(x => x.DbName == key.COLUMN_NAME); var candidateKeyColumn = database .Tables.Single(x => x.DbName == key.REFERENCED_TABLE_NAME) .Columns.Single(x => x.DbName == key.REFERENCED_COLUMN_NAME); relation.ForeignKey = CreateRelationPart(relation, foreignKeyColumn, RelationPartType.ForeignKey); relation.CandidateKey = CreateRelationPart(relation, candidateKeyColumn, RelationPartType.CandidateKey); } database.Relations = database .Tables.SelectMany(x => x.Columns.SelectMany(y => y.RelationParts.Select(z => z.Relation))) .Distinct() .ToList(); return(database); }