public List <EntityInfo> Load(IEnumerable <TTable> inputTables, ILog log = null) { log = log ?? EmptyLog.Instance; var tables = inputTables.ToArray(); var dict = new Dictionary <TTable, EntityInfo>(); foreach (var table in tables) { var entityName = GetName(table, _entityExtractor.GetName, s => dict.Values.Any(t => t.Name == s), log, "Duplicate table name '{0}'."); var entity = new EntityInfo { Name = entityName, TableSchemaName = table.Schema, TableName = table.Name, EntitySetName = table.Content.CodeNamePlural, Description = table.Description }; dict.Add(table, entity); #region Columns foreach (var column in table.Columns) { var data = new PropertyMetadata <TTable, TTableContent, TColumn, TColumnContent>(table, column); var name = GetName(data, _propertyExtractor.GetSimplePropertyName, s => entity.Properties.Any(p => p.Name == s), log, string.Format("Duplicate property name '{{0}}' in entity '{0}'.", entity.Name)); var typeInfo = _propertyExtractor.GetSimplePropertyTypeInfo(data); var property = new SimplePropertyEntityInfo(name, typeInfo) { ColumnName = column.Name, Description = column.Description, IsKey = column.IsKeyColumn, IsRequired = column.IsRequired }; if (column.KeyOrder.HasValue) { property.KeyOrder = column.KeyOrder.Value; } foreach (var handler in _simplePropertiesHandlers) { handler.Run(column, property); } entity.SimpleProperties.Add(property); } #endregion } #region Navigation properties //TODO: Implement relationship recognition after custom indexes!!!!! one - one one,zero - one etc. //TODO: Implement many to many foreach (var relation in tables.SelectMany(table => table.FromRelations)) { var fromEntity = dict[relation.FromTable]; var fromType = fromEntity.GetKeyProperties(relation.FromColumns).Any(p => !p.IsRequired) ? NavigationType.Optional : NavigationType.Required; var fromSide = GetRelationSideMetadata(relation.FromTable, relation.FromColumns.ToArray(), dict[relation.FromTable], fromType); var toSide = GetRelationSideMetadata(relation.ToTable, relation.ToColumns.ToArray(), dict[relation.ToTable], NavigationType.Many); var data = new RelationshipData <TTable, TTableContent, TColumn, TColumnContent>(fromSide, toSide) { WillCascadeOnDelete = relation.WillCascadeOnDelete }; if (!_relationshipExtractor.HandleAndApproveRelationship(data)) { continue; } var from = GetRelationSide(log, new NavigationPropertyNameData <TTable, TColumn>(data, NavigationPropertyName.From)); var to = GetRelationSide(log, new NavigationPropertyNameData <TTable, TColumn>(data, NavigationPropertyName.To)); AddNavPropertyToEntity(from); AddNavPropertyToEntity(to); var relationship = new EntityRelationship(from, to, data.WillCascadeOnDelete); from.Entity.Relations.Add(relationship); to.Entity.Relations.Add(relationship); } #endregion #region Final handling foreach (var entity in dict) { foreach (var handler in _tableHandlers) { handler.Run(entity.Key, entity.Value); } } #endregion //TODO: Need resolve duplicated names in tables and columns return(dict.Values.ToList()); }