private static IEnumerable <XElement> MappingComplexProperties(TypeBase type, MappingBase mapping, EDMObjects.SSDL.EntityType.EntityType table, string entityContainerNamespace) { foreach (ComplexProperty complexProperty in type.AllComplexProperties) { ComplexPropertyMapping complexPropertyMapping = mapping.GetEntityTypeSpecificComplexPropertyMapping(complexProperty); if (complexPropertyMapping != null) { XElement complexPropertyElement = new XElement(mslNamespace + "ComplexProperty", new XAttribute("Name", complexProperty.Name)); IEnumerable <PropertyMapping> scalarMappings = complexPropertyMapping.GetSpecificMappingForTable(table); foreach (PropertyMapping scalarMapping in scalarMappings) { complexPropertyElement.AddElement(new XElement(mslNamespace + "ScalarProperty", new XAttribute("Name", scalarMapping.Property.Name), new XAttribute("ColumnName", scalarMapping.Column.Name))); } foreach (ComplexProperty subComplexProperty in complexProperty.ComplexType.ComplexProperties) { complexPropertyElement.Add(MappingComplexProperties(complexProperty.ComplexType, complexPropertyMapping, table, entityContainerNamespace)); } yield return(complexPropertyElement); } } }
private IEnumerable <EfColumnInfo> DecodeComplexTypes(ComplexPropertyMapping complexMapping, Type parentClass) { //throw new NotImplementedException("We do not currently handle complex properties"); var complexCols = new List <EfColumnInfo>(); foreach (var property in complexMapping.TypeMappings.SelectMany(x => x.PropertyMappings)) { var complexClrType = Ef6MetadataDecoder.GetPublicAndPrivatePropertyByName(parentClass, complexMapping.Property.Name) .PropertyType; if (property.Property.IsComplexType) { complexCols.AddRange(DecodeComplexTypes((ComplexPropertyMapping)property, complexClrType)); } else { var columnName = ((ScalarPropertyMapping)property).Column.Name; var sqlTypeName = _tableEntitySet.ElementType.DeclaredMembers .Single(x => x.Name == columnName).TypeUsage.EdmType.Name; var clrProperty = Ef6MetadataDecoder.GetPublicAndPrivatePropertyByName(complexClrType, property.Property.Name); complexCols.Add(new EfColumnInfo(columnName, sqlTypeName, property.Property.Nullable, property.Property.MaxLength, property.Property.Precision, null, clrProperty)); } } return(complexCols); }
private void ExtractProperties( IEnumerable <PropertyMapping> properties, MemberPath cNode, List <ProjectedSlot> cSlots, ref BoolExpression cQueryWhereClause, MemberPath sRootExtent, List <ProjectedSlot> sSlots, ref BoolExpression sQueryWhereClause) { foreach (PropertyMapping property in properties) { ScalarPropertyMapping scalarPropertyMapping = property as ScalarPropertyMapping; ComplexPropertyMapping complexPropertyMapping = property as ComplexPropertyMapping; EndPropertyMapping endPropertyMapping = property as EndPropertyMapping; ConditionPropertyMapping conditionMap = property as ConditionPropertyMapping; if (scalarPropertyMapping != null) { MemberPath node1 = new MemberPath(cNode, (EdmMember)scalarPropertyMapping.Property); MemberPath node2 = new MemberPath(sRootExtent, (EdmMember)scalarPropertyMapping.Column); cSlots.Add((ProjectedSlot) new MemberProjectedSlot(node1)); sSlots.Add((ProjectedSlot) new MemberProjectedSlot(node2)); } if (complexPropertyMapping != null) { foreach (ComplexTypeMapping typeMapping in complexPropertyMapping.TypeMappings) { MemberPath memberPath = new MemberPath(cNode, (EdmMember)complexPropertyMapping.Property); Set <EdmType> set = new Set <EdmType>(); IEnumerable <EdmType> elements = Helpers.AsSuperTypeList <ComplexType, EdmType>((IEnumerable <ComplexType>)typeMapping.Types); set.AddRange(elements); foreach (EdmType isOfType in typeMapping.IsOfTypes) { set.AddRange(MetadataHelper.GetTypeAndSubtypesOf(isOfType, (ItemCollection)this.m_containerMapping.StorageMappingItemCollection.EdmItemCollection, false)); } BoolExpression literal = BoolExpression.CreateLiteral((BoolLiteral) new TypeRestriction(memberPath, (IEnumerable <EdmType>)set), (MemberDomainMap)null); cQueryWhereClause = BoolExpression.CreateAnd(cQueryWhereClause, literal); this.ExtractProperties((IEnumerable <PropertyMapping>)typeMapping.AllProperties, memberPath, cSlots, ref cQueryWhereClause, sRootExtent, sSlots, ref sQueryWhereClause); } } if (endPropertyMapping != null) { MemberPath cNode1 = new MemberPath(cNode, (EdmMember)endPropertyMapping.AssociationEnd); this.ExtractProperties((IEnumerable <PropertyMapping>)endPropertyMapping.PropertyMappings, cNode1, cSlots, ref cQueryWhereClause, sRootExtent, sSlots, ref sQueryWhereClause); } if (conditionMap != null) { if (conditionMap.Column != null) { BoolExpression conditionExpression = CellCreator.GetConditionExpression(sRootExtent, conditionMap); sQueryWhereClause = BoolExpression.CreateAnd(sQueryWhereClause, conditionExpression); } else { BoolExpression conditionExpression = CellCreator.GetConditionExpression(cNode, conditionMap); cQueryWhereClause = BoolExpression.CreateAnd(cQueryWhereClause, conditionExpression); } } } }
private void WritePropertyMapping(ComplexPropertyMapping complexPropertyMapping) { this._xmlWriter.WriteStartElement("ComplexProperty"); this._xmlWriter.WriteAttributeString("Name", complexPropertyMapping.Property.Name); this._xmlWriter.WriteAttributeString("TypeName", this._entityTypeNamespace + "." + complexPropertyMapping.Property.ComplexType.Name); foreach (PropertyMapping propertyMapping in complexPropertyMapping.TypeMappings.Single <ComplexTypeMapping>().PropertyMappings) { this.WritePropertyMapping(propertyMapping); } this._xmlWriter.WriteEndElement(); }
private void WritePropertyMapping(ComplexPropertyMapping complexPropertyMapping) { DebugCheck.NotNull(complexPropertyMapping); _xmlWriter.WriteStartElement(MslConstructs.ComplexPropertyElement); _xmlWriter.WriteAttributeString(MslConstructs.ComplexPropertyNameAttribute, complexPropertyMapping.Property.Name); _xmlWriter.WriteAttributeString( MslConstructs.ComplexPropertyTypeNameAttribute, _entityTypeNamespace + "." + complexPropertyMapping.Property.ComplexType.Name); foreach (var propertyMapping in complexPropertyMapping.TypeMappings.Single().PropertyMappings) { WritePropertyMapping(propertyMapping); } _xmlWriter.WriteEndElement(); }
private void WritePropertyMapping(PropertyMapping propertyMapping) { ScalarPropertyMapping scalarPropertyMapping = propertyMapping as ScalarPropertyMapping; if (scalarPropertyMapping != null) { this.WritePropertyMapping(scalarPropertyMapping); } else { ComplexPropertyMapping complexPropertyMapping = propertyMapping as ComplexPropertyMapping; if (complexPropertyMapping == null) { return; } this.WritePropertyMapping(complexPropertyMapping); } }
private static IEnumerable <PropertyMapping> FlattenPropertyMappings( ReadOnlyCollection <PropertyMapping> propertyMappings) { foreach (PropertyMapping propertyMapping in propertyMappings) { ComplexPropertyMapping complexPropertyMapping = propertyMapping as ComplexPropertyMapping; if (complexPropertyMapping != null) { foreach (ComplexTypeMapping typeMapping in complexPropertyMapping.TypeMappings) { foreach (PropertyMapping flattenPropertyMapping in ViewLoader.FlattenPropertyMappings(typeMapping.AllProperties)) { yield return(flattenPropertyMapping); } } } else { yield return(propertyMapping); } } }
/// <summary> /// Gets the name of the column for the property wihin a complex type from the metadata. /// </summary> /// <param name="complexPropertyMapping">EF metadata for finding mappings from conceptual model to db.</param> /// <param name="complexProperty">The complex property containing the enumProperty.</param> /// <param name="enumProperty">The property we want column name for.</param> /// <returns>The column name for the enumProperty</returns> /// <exception cref="EnumGeneratorException"> /// </exception> private static string GetColumnNameForEnumWithinComplexProperty(ComplexPropertyMapping complexPropertyMapping, EdmProperty complexProperty, EdmProperty enumProperty) { var complexTypeMappings = complexPropertyMapping.TypeMappings; if (complexTypeMappings.Count() != 1) { throw new EnumGeneratorException(string.Format( "{0} complexPropertyMapping TypeMappings found for property {1}.{2}", complexTypeMappings.Count(), complexProperty, enumProperty)); } var complexTypeMapping = complexTypeMappings.Single(); var propertyMappings = complexTypeMapping.PropertyMappings.Where(pm => pm.Property.Name == enumProperty.Name).ToList(); if (propertyMappings.Count() != 1) { throw new EnumGeneratorException(string.Format( "{0} complexMappings found for property {1}.{2}", propertyMappings.Count(), complexProperty, enumProperty)); } var propertyMapping = propertyMappings.Single(); return(GetColumnNameFromPropertyMapping(complexProperty, propertyMapping)); }