/// <summary> /// MultipleDiscriminatorPolymorphicColumnMap /// </summary> internal override ColumnMap Visit(MultipleDiscriminatorPolymorphicColumnMap columnMap, ColumnMapTranslatorTranslationDelegate translationDelegate) { // At this time, we shouldn't ever see this type here; it's for SPROCS which don't use // the plan compiler. System.Data.Query.PlanCompiler.PlanCompiler.Assert(false, "unexpected MultipleDiscriminatorPolymorphicColumnMap in ColumnMapTranslator"); return(null); }
internal override void Visit(MultipleDiscriminatorPolymorphicColumnMap columnMap, int dummy) { // MultipleDiscriminator maps contain an opaque discriminator delegate, so recompilation // is always required. Generate a unique key for the discriminator. // FUTURE: consider using either a separate cache for MultipleDiscriminator OR make the delegate transparent Append(String.Format(CultureInfo.InvariantCulture, "MD-{0}", Guid.NewGuid())); }
internal override void Visit(MultipleDiscriminatorPolymorphicColumnMap columnMap, int dummy) { // MultipleDiscriminator maps contain an opaque discriminator delegate, so recompilation // is always required. Generate a unique key for the discriminator. // Append(String.Format(CultureInfo.InvariantCulture, "MD-{0}", Guid.NewGuid())); }
internal override ColumnMap Visit( MultipleDiscriminatorPolymorphicColumnMap columnMap, ColumnMapTranslatorTranslationDelegate translationDelegate) { System.Data.Entity.Core.Query.PlanCompiler.PlanCompiler.Assert(false, "unexpected MultipleDiscriminatorPolymorphicColumnMap in ColumnMapTranslator"); return((ColumnMap)null); }
/// <summary> /// Creates a column map for the given reader and function mapping. /// </summary> internal virtual CollectionColumnMap CreateFunctionImportStructuralTypeColumnMap( DbDataReader storeDataReader, FunctionImportMappingNonComposable mapping, int resultSetIndex, EntitySet entitySet, StructuralType baseStructuralType) { var resultMapping = mapping.GetResultMapping(resultSetIndex); Debug.Assert(resultMapping != null); if (resultMapping.NormalizedEntityTypeMappings.Count == 0) // no explicit mapping; use default non-polymorphic reader { // if there is no mapping, create default mapping to root entity type or complex type Debug.Assert(!baseStructuralType.Abstract, "mapping loader must verify abstract types have explicit mapping"); return CreateColumnMapFromReaderAndType( storeDataReader, baseStructuralType, entitySet, resultMapping.ReturnTypeColumnsRenameMapping); } // the section below deals with the polymorphic entity type mapping for return type var baseEntityType = baseStructuralType as EntityType; Debug.Assert(null != baseEntityType, "We should have entity type here"); // Generate column maps for all discriminators var discriminatorColumns = CreateDiscriminatorColumnMaps(storeDataReader, mapping, resultSetIndex); // Generate default maps for all mapped entity types var mappedEntityTypes = new HashSet<EntityType>(resultMapping.MappedEntityTypes); mappedEntityTypes.Add(baseEntityType); // make sure the base type is represented var typeChoices = new Dictionary<EntityType, TypedColumnMap>(mappedEntityTypes.Count); ColumnMap[] baseTypeColumnMaps = null; foreach (var entityType in mappedEntityTypes) { var propertyColumnMaps = GetColumnMapsForType(storeDataReader, entityType, resultMapping.ReturnTypeColumnsRenameMapping); var entityColumnMap = CreateEntityTypeElementColumnMap( storeDataReader, entityType, entitySet, propertyColumnMaps, resultMapping.ReturnTypeColumnsRenameMapping); if (!entityType.Abstract) { typeChoices.Add(entityType, entityColumnMap); } if (entityType == baseStructuralType) { baseTypeColumnMaps = propertyColumnMaps; } } // NOTE: We don't have a null sentinel here, because the stored proc won't // return one anyway; we'll just presume the data's always there. var polymorphicMap = new MultipleDiscriminatorPolymorphicColumnMap( TypeUsage.Create(baseStructuralType), baseStructuralType.Name, baseTypeColumnMaps, discriminatorColumns, typeChoices, (object[] discriminatorValues) => mapping.Discriminate(discriminatorValues, resultSetIndex)); CollectionColumnMap collection = new SimpleCollectionColumnMap( baseStructuralType.GetCollectionType().TypeUsage, baseStructuralType.Name, polymorphicMap, null, null); return collection; }
internal virtual void Visit(MultipleDiscriminatorPolymorphicColumnMap columnMap, TArgType arg) { foreach (var typeDiscriminator in columnMap.TypeDiscriminators) { typeDiscriminator.Accept(this, arg); } foreach (var typeColumnMap in columnMap.TypeChoices.Values) { typeColumnMap.Accept(this, arg); } foreach (var property in columnMap.Properties) { property.Accept(this, arg); } }
public void TranslateColumnMap_with_MultipleDiscriminatorPolymorphicColumnMap_returns_a_ShaperFactory() { var polymorphicMap = new MultipleDiscriminatorPolymorphicColumnMap( new Mock<TypeUsage>().Object, "MockType", new ColumnMap[0], new SimpleColumnMap[0], new Dictionary<EntityType, TypedColumnMap>(), discriminatorValues => new EntityType("E", "N", DataSpace.CSpace)); CollectionColumnMap collection = new SimpleCollectionColumnMap( new Mock<TypeUsage>().Object, "MockCollectionType", polymorphicMap, null, null); var metadataWorkspaceMock = new Mock<MetadataWorkspace>(); metadataWorkspaceMock.Setup(m => m.GetQueryCacheManager()).Returns(QueryCacheManager.Create()); Assert.NotNull( new Translator().TranslateColumnMap<object>( collection, metadataWorkspaceMock.Object, new SpanIndex(), MergeOption.NoTracking, streaming: true, valueLayer: false)); }
public void TranslateColumnMap_with_MultipleDiscriminatorPolymorphicColumnMap_returns_a_ShaperFactory() { var polymorphicMap = new MultipleDiscriminatorPolymorphicColumnMap( new Mock <TypeUsage>().Object, "MockType", new ColumnMap[0], new SimpleColumnMap[0], new Dictionary <EntityType, TypedColumnMap>(), discriminatorValues => new EntityType("E", "N", DataSpace.CSpace)); CollectionColumnMap collection = new SimpleCollectionColumnMap( new Mock <TypeUsage>().Object, "MockCollectionType", polymorphicMap, null, null); var metadataWorkspaceMock = new Mock <MetadataWorkspace>(); metadataWorkspaceMock.Setup(m => m.GetQueryCacheManager()).Returns(QueryCacheManager.Create()); Assert.NotNull( new Translator().TranslateColumnMap <object>( collection, metadataWorkspaceMock.Object, new SpanIndex(), MergeOption.NoTracking, streaming: true, valueLayer: false)); }
internal abstract TResultType Visit( MultipleDiscriminatorPolymorphicColumnMap columnMap, TArgType arg);
internal override void Visit( MultipleDiscriminatorPolymorphicColumnMap columnMap, int dummy) { this.Append(string.Format((IFormatProvider)CultureInfo.InvariantCulture, "MD-{0}", (object)Guid.NewGuid())); }