Пример #1
0
 /// <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);
 }
Пример #2
0
 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()));
 }
Пример #4
0
 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;
        }
Пример #6
0
 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);
     }
 }
Пример #7
0
        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));
        }
Пример #8
0
        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));
        }
Пример #9
0
 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()));
 }