protected internal virtual void WriteDaoSchema(TypeSchema typeSchema, SchemaManager schemaManager, List <KeyColumn> missingKeyColumns = null, List <ForeignKeyColumn> missingForeignKeyColumns = null, ITypeTableNameProvider tableNameProvider = null) { AddSchemaTables(typeSchema, schemaManager, tableNameProvider); HashSet <TypeFk> foreignKeyTypes = typeSchema.ForeignKeys; HashSet <TypeXref> xrefTypes = typeSchema.Xrefs; // accounting for missing columns // loop primary keys and fks separately to ensure // missing keys get recorded prior to trying to add the // fks foreach (TypeFk foreignKey in foreignKeyTypes) { TypeSchemaPropertyInfo keyInfo = foreignKey.PrimaryKeyProperty as TypeSchemaPropertyInfo; if (keyInfo != null) { KeyColumn key = keyInfo.ToKeyColumn(); schemaManager.AddColumn(key.TableName, key); schemaManager.SetKeyColumn(key.TableName, key.Name); if (missingKeyColumns != null) { missingKeyColumns.Add(key); } } } foreach (TypeFk foreignKey in foreignKeyTypes) { TypeSchemaPropertyInfo fkInfo = foreignKey.ForeignKeyProperty as TypeSchemaPropertyInfo; if (fkInfo != null) { PropertyInfo keyProperty = GetKeyProperty(foreignKey.PrimaryKeyType, missingKeyColumns); string referencedKeyName = keyProperty.Name; ForeignKeyColumn fk = fkInfo.ToForeignKeyColumn(tableNameProvider); fk.AllowNull = true; schemaManager.AddColumn(fk.TableName, fk); schemaManager.SetForeignKey(fk.ReferencedTable, fk.TableName, fk.Name, referencedKeyName); if (missingForeignKeyColumns != null) { missingForeignKeyColumns.Add(fk); } } } // /end - accounting for missing columns foreach (TypeFk foreignKey in foreignKeyTypes) { schemaManager.SetForeignKey( GetTableNameForType(foreignKey.PrimaryKeyType, tableNameProvider), GetTableNameForType(foreignKey.ForeignKeyType, tableNameProvider), foreignKey.ForeignKeyProperty.Name); } foreach (TypeXref xref in xrefTypes) { schemaManager.SetXref(GetTableNameForType(xref.Left, tableNameProvider), GetTableNameForType(xref.Right, tableNameProvider)); } }