/// <summary> /// EntityColumnMap /// </summary> /// <param name="columnMap"> </param> /// <param name="replacementVarMap"> </param> /// <returns> </returns> internal override ColumnMap Visit(EntityColumnMap columnMap, VarMap replacementVarMap) { var newEntityIdentity = VisitEntityIdentity(columnMap.EntityIdentity, replacementVarMap); var fieldList = VisitList(columnMap.Properties, replacementVarMap); return(new EntityColumnMap(columnMap.Type, columnMap.Name, fieldList, newEntityIdentity)); }
internal override ColumnMap Visit(EntityColumnMap columnMap, VarMap replacementVarMap) { EntityIdentity entityIdentity = this.VisitEntityIdentity(columnMap.EntityIdentity, replacementVarMap); ColumnMap[] properties = this.VisitList <ColumnMap>(columnMap.Properties, replacementVarMap); return((ColumnMap) new EntityColumnMap(columnMap.Type, columnMap.Name, properties, entityIdentity)); }
internal override void Visit(EntityColumnMap columnMap, Dump dumper) { using (new Dump.AutoXml(dumper, "Entity", Dump.ColumnMapDumper.GetAttributes((ColumnMap)columnMap))) { using (new Dump.AutoXml(dumper, "entityIdentity")) this.VisitEntityIdentity(columnMap.EntityIdentity, dumper); this.VisitList <ColumnMap>(columnMap.Properties, dumper); } }
/// <summary> /// EntityColumnMap /// </summary> internal override void Visit(EntityColumnMap columnMap, Dump dumper) { using (new AutoXml(dumper, "Entity", GetAttributes(columnMap))) { using (new AutoXml(dumper, "entityIdentity")) { VisitEntityIdentity(columnMap.EntityIdentity, dumper); } VisitList(columnMap.Properties, dumper); } }
// <summary> // Build the entityColumnMap from a store datareader, a type and an entitySet and // a list of properties. // </summary> private static EntityColumnMap CreateEntityTypeElementColumnMap( DbDataReader storeDataReader, EdmType edmType, EntitySet entitySet, ColumnMap[] propertyColumnMaps, Dictionary <string, FunctionImportReturnTypeStructuralTypeColumnRenameMapping> renameList) { var entityType = (EntityType)edmType; // The tricky part here is // that the KeyColumns list must point at the same ColumnMap(s) that // the properties list points to, so we build a quick array of // ColumnMap(s) that are indexed by their ordinal; then we can walk // the list of keyMembers, and find the ordinal in the reader, and // pick the same ColumnMap for it. // Build the ordinal -> ColumnMap index var ordinalToColumnMap = new ColumnMap[storeDataReader.FieldCount]; foreach (var propertyColumnMap in propertyColumnMaps) { var ordinal = ((ScalarColumnMap)propertyColumnMap).ColumnPos; ordinalToColumnMap[ordinal] = propertyColumnMap; } // Now build the list of KeyColumns; IList <EdmMember> keyMembers = entityType.KeyMembers; var keyColumns = new SimpleColumnMap[keyMembers.Count]; var keyMemberIndex = 0; foreach (var keyMember in keyMembers) { var keyOrdinal = GetMemberOrdinalFromReader(storeDataReader, keyMember, edmType, renameList); Debug.Assert(keyOrdinal >= 0, "keyMember for entity is not found by name in the data reader?"); var keyColumnMap = ordinalToColumnMap[keyOrdinal]; Debug.Assert(null != keyColumnMap, "keyMember for entity isn't in properties collection for the entity?"); keyColumns[keyMemberIndex] = (SimpleColumnMap)keyColumnMap; keyMemberIndex++; } var entityIdentity = new SimpleEntityIdentity(entitySet, keyColumns); var result = new EntityColumnMap(TypeUsage.Create(edmType), edmType.Name, propertyColumnMaps, entityIdentity); return(result); }
internal virtual CollectionColumnMap CreateFunctionImportStructuralTypeColumnMap( DbDataReader storeDataReader, FunctionImportMappingNonComposable mapping, int resultSetIndex, EntitySet entitySet, StructuralType baseStructuralType) { FunctionImportStructuralTypeMappingKB resultMapping = mapping.GetResultMapping(resultSetIndex); if (resultMapping.NormalizedEntityTypeMappings.Count == 0) { return(this.CreateColumnMapFromReaderAndType(storeDataReader, (EdmType)baseStructuralType, entitySet, resultMapping.ReturnTypeColumnsRenameMapping)); } EntityType entityType = baseStructuralType as EntityType; ScalarColumnMap[] discriminatorColumnMaps = ColumnMapFactory.CreateDiscriminatorColumnMaps(storeDataReader, mapping, resultSetIndex); HashSet <EntityType> entityTypeSet = new HashSet <EntityType>((IEnumerable <EntityType>)resultMapping.MappedEntityTypes); entityTypeSet.Add(entityType); Dictionary <EntityType, TypedColumnMap> typeChoices = new Dictionary <EntityType, TypedColumnMap>(entityTypeSet.Count); ColumnMap[] baseTypeColumns = (ColumnMap[])null; foreach (EntityType key in entityTypeSet) { ColumnMap[] columnMapsForType = ColumnMapFactory.GetColumnMapsForType(storeDataReader, (EdmType)key, resultMapping.ReturnTypeColumnsRenameMapping); EntityColumnMap elementColumnMap = ColumnMapFactory.CreateEntityTypeElementColumnMap(storeDataReader, (EdmType)key, entitySet, columnMapsForType, resultMapping.ReturnTypeColumnsRenameMapping); if (!key.Abstract) { typeChoices.Add(key, (TypedColumnMap)elementColumnMap); } if (key == baseStructuralType) { baseTypeColumns = columnMapsForType; } } MultipleDiscriminatorPolymorphicColumnMap polymorphicColumnMap = new MultipleDiscriminatorPolymorphicColumnMap(TypeUsage.Create((EdmType)baseStructuralType), baseStructuralType.Name, baseTypeColumns, (SimpleColumnMap[])discriminatorColumnMaps, typeChoices, (Func <object[], EntityType>)(discriminatorValues => mapping.Discriminate(discriminatorValues, resultSetIndex))); return((CollectionColumnMap) new SimpleCollectionColumnMap(baseStructuralType.GetCollectionType().TypeUsage, baseStructuralType.Name, (ColumnMap)polymorphicColumnMap, (SimpleColumnMap[])null, (SimpleColumnMap[])null)); }