private static Type DetermineEntityType(Expression expression) { var type = expression.Type; return(typeof(IEntityCore).IsAssignableFrom(type) ? type : LinqUtils.DetermineEntityTypeFromEntityCollectionType(type)); }
/// <summary> /// Discovers the entity navigators. /// </summary> /// <param name="entitySchemaData">The entity schema data.</param> private void DiscoverEntityNavigators(EntityTypeSchemaData entitySchemaData) { var entityType = entitySchemaData.EntityType; if (entitySchemaData.Factory == null) { throw new InvalidOperationException(string.Format("Factory is null in entitySchemaData for entity '{0}'", entitySchemaData.EntityType.FullName)); } var dummyInstance = entitySchemaData.Factory.Create(); var relationsWithMappedFields = dummyInstance.GetAllRelations().Where(r => !string.IsNullOrEmpty(r.MappedFieldName) && !r.IsHierarchyRelation); var relationPerMappedFieldName = relationsWithMappedFields.ToDictionary(r => r.MappedFieldName); var properties = TypeDescriptor.GetProperties(entityType).Cast <PropertyDescriptor>(); var inheritedProperties = new HashSet <PropertyDescriptor>(DetermineInheritedProperties(entitySchemaData.EntityType, properties)); var childrenCollection = entitySchemaData.RelatedExplorerItem.Children; foreach (PropertyDescriptor property in properties) { if (!(typeof(IEntityCore).IsAssignableFrom(property.PropertyType) || typeof(IEntityCollectionCore).IsAssignableFrom(property.PropertyType))) { // not an entity navigator, continue; } string suffix = string.Empty; bool inherited = false; if (inheritedProperties.Contains(property)) { suffix = string.Format(" (Inherited from '{0}')", property.ComponentType.Name.Replace("Entity", "")); inherited = true; } // relationMapped can be null, in the case of a m:n navigator. IEntityRelation relationMapped = null; relationPerMappedFieldName.TryGetValue(property.Name, out relationMapped); if (typeof(IEntityCore).IsAssignableFrom(property.PropertyType)) { var relatedEntitySchemaData = GetEntitySchemaDataForType(property.PropertyType); // single entity navigator, or property added manually. if (relationMapped == null) { // property added manually, ignore. continue; } var icon = relationMapped.TypeOfRelation == RelationType.ManyToOne ? ExplorerIcon.ManyToOne : ExplorerIcon.OneToOne; if (inherited) { icon = ExplorerIcon.Inherited; } childrenCollection.Add(new ExplorerItem(property.Name + suffix, ExplorerItemKind.ReferenceLink, icon) { DragText = property.Name, HyperlinkTarget = relatedEntitySchemaData == null ? null : relatedEntitySchemaData.RelatedExplorerItem }); continue; } if (typeof(IEntityCollectionCore).IsAssignableFrom(property.PropertyType)) { // collection navigator. We have to determine which entity type is returned from the collection. // First, check if there's a TypeContainedAttribute on the property. If so, use the type in the attribute. If not, // try to determine the type using the linq utils method. Type containedType = null; var typeContainedAttribute = property.Attributes[typeof(TypeContainedAttribute)] as TypeContainedAttribute; if ((typeContainedAttribute != null) && typeContainedAttribute.TypeContainedInCollection != null) { containedType = typeContainedAttribute.TypeContainedInCollection; } else { containedType = LinqUtils.DetermineEntityTypeFromEntityCollectionType(property.PropertyType); } var relatedEntitySchemaData = GetEntitySchemaDataForType(containedType); var icon = relationMapped == null ? ExplorerIcon.ManyToMany : ExplorerIcon.OneToMany; if (inherited) { icon = ExplorerIcon.Inherited; } childrenCollection.Add(new ExplorerItem(property.Name + suffix, ExplorerItemKind.CollectionLink, icon) { DragText = property.Name, HyperlinkTarget = relatedEntitySchemaData == null ? null : relatedEntitySchemaData.RelatedExplorerItem }); } } }