コード例 #1
0
        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());
        }