public void WriteFunctionImportMappingElement(FunctionImportMappingComposable functionImportMapping) { DebugCheck.NotNull(functionImportMapping); _xmlWriter.WriteStartElement(StorageMslConstructs.FunctionImportMappingElement); _xmlWriter.WriteAttributeString( StorageMslConstructs.FunctionImportMappingFunctionNameAttribute, functionImportMapping.TargetFunction.FullName); _xmlWriter.WriteAttributeString( StorageMslConstructs.FunctionImportMappingFunctionImportNameAttribute, functionImportMapping.FunctionImport.Name); _xmlWriter.WriteStartElement(StorageMslConstructs.FunctionImportMappingResultMapping); Debug.Assert( functionImportMapping.StructuralTypeMappings.Count == 1, "multiple result sets not supported."); Debug.Assert( functionImportMapping.StructuralTypeMappings.First().Item1.BuiltInTypeKind == BuiltInTypeKind.ComplexType, "mapping to entity sets not supported."); var structuralMapping = functionImportMapping.StructuralTypeMappings.Single(); _xmlWriter.WriteStartElement(StorageMslConstructs.ComplexTypeMappingElement); _xmlWriter.WriteAttributeString(StorageMslConstructs.ComplexTypeMappingTypeNameAttribute, structuralMapping.Item1.FullName); foreach (StorageScalarPropertyMapping propertyMapping in structuralMapping.Item3) { WritePropertyMapping(propertyMapping); } _xmlWriter.WriteEndElement(); _xmlWriter.WriteEndElement(); _xmlWriter.WriteEndElement(); }
public void WriteFunctionImportMappingElement( FunctionImportMappingComposable functionImportMapping) { this.WriteFunctionImportMappingStartElement((FunctionImportMapping)functionImportMapping); if (functionImportMapping.StructuralTypeMappings != null) { this._xmlWriter.WriteStartElement("ResultMapping"); Tuple <StructuralType, List <ConditionPropertyMapping>, List <PropertyMapping> > tuple = functionImportMapping.StructuralTypeMappings.Single <Tuple <StructuralType, List <ConditionPropertyMapping>, List <PropertyMapping> > >(); if (tuple.Item1.BuiltInTypeKind == BuiltInTypeKind.ComplexType) { this._xmlWriter.WriteStartElement("ComplexTypeMapping"); this._xmlWriter.WriteAttributeString("TypeName", tuple.Item1.FullName); } else { this._xmlWriter.WriteStartElement("EntityTypeMapping"); this._xmlWriter.WriteAttributeString("TypeName", tuple.Item1.FullName); foreach (ConditionPropertyMapping condition in tuple.Item2) { this.WriteConditionElement(condition); } } foreach (PropertyMapping propertyMapping in tuple.Item3) { this.WritePropertyMapping(propertyMapping); } this._xmlWriter.WriteEndElement(); this._xmlWriter.WriteEndElement(); } this.WriteFunctionImportEndElement(); }
public void WriteFunctionImportMappingElement_does_not_write_result_mapping_when_result_mapped_to_primitive_type() { var typeUsage = TypeUsage.CreateDefaultTypeUsage(PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Int32)); var functionImport = new EdmFunction( "f_c", "Ns", DataSpace.CSpace, new EdmFunctionPayload { IsComposable = true, IsFunctionImport = true, ReturnParameters = new[] { new FunctionParameter( "ReturnValue", TypeUsage.CreateDefaultTypeUsage(typeUsage.EdmType.GetCollectionType()), ParameterMode.ReturnValue) }, }); var rowTypeProperty = new EdmProperty("RTProperty1", ProviderRegistry.Sql2008_ProviderManifest.GetStoreType(typeUsage)); var rowType = new RowType(new[] { rowTypeProperty }); var storeFunction = new EdmFunction( "f_s", "Ns.Store", DataSpace.SSpace, new EdmFunctionPayload { ReturnParameters = new[] { new FunctionParameter( "Return", TypeUsage.CreateDefaultTypeUsage(rowType.GetCollectionType()), ParameterMode.ReturnValue) }, }); var functionImportMapping = new FunctionImportMappingComposable( functionImport, storeFunction, new FunctionImportResultMapping(), new EntityContainerMapping(new EntityContainer("C", DataSpace.SSpace))); var fixture = new Fixture(); fixture.Writer.WriteFunctionImportMappingElement(functionImportMapping); Assert.Equal( @"<FunctionImportMapping FunctionName=""Ns.Store.f_s"" FunctionImportName=""f_c"" />", fixture.ToString()); }
public void WriteFunctionImportMappingElement(FunctionImportMappingComposable functionImportMapping) { DebugCheck.NotNull(functionImportMapping); WriteFunctionImportMappingStartElement(functionImportMapping); // no mapping written when mapping to a scalar if (functionImportMapping.StructuralTypeMappings != null) { _xmlWriter.WriteStartElement(MslConstructs.FunctionImportMappingResultMapping); Debug.Assert( functionImportMapping.StructuralTypeMappings.Count == 1, "multiple result sets not supported."); var structuralMapping = functionImportMapping.StructuralTypeMappings.Single(); if (structuralMapping.Item1.BuiltInTypeKind == BuiltInTypeKind.ComplexType) { _xmlWriter.WriteStartElement(MslConstructs.ComplexTypeMappingElement); _xmlWriter.WriteAttributeString(MslConstructs.ComplexTypeMappingTypeNameAttribute, structuralMapping.Item1.FullName); } else { Debug.Assert(structuralMapping.Item1.BuiltInTypeKind == BuiltInTypeKind.EntityType, "Unexpected return type"); _xmlWriter.WriteStartElement(MslConstructs.EntityTypeMappingElement); _xmlWriter.WriteAttributeString(MslConstructs.EntityTypeMappingTypeNameAttribute, structuralMapping.Item1.FullName); foreach (var conditionMapping in structuralMapping.Item2) { WriteConditionElement(conditionMapping); } } foreach (var propertyMapping in structuralMapping.Item3) { WritePropertyMapping(propertyMapping); } _xmlWriter.WriteEndElement(); _xmlWriter.WriteEndElement(); } WriteFunctionImportEndElement(); }
public void WriteEntityContainerMappingElement_should_write_function_import_elements() { var typeUsage = TypeUsage.CreateDefaultTypeUsage(PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Int32)); var complexTypeProperty1 = new EdmProperty("CTProperty1", typeUsage); var complexTypeProperty2 = new EdmProperty("CTProperty2", typeUsage); var complexType = new ComplexType("CT", "Ns", DataSpace.CSpace); complexType.AddMember(complexTypeProperty1); complexType.AddMember(complexTypeProperty2); var functionImport = new EdmFunction( "f_c", "Ns", DataSpace.CSpace, new EdmFunctionPayload { IsComposable = true, IsFunctionImport = true, ReturnParameters = new[] { new FunctionParameter( "ReturnValue", TypeUsage.CreateDefaultTypeUsage(complexType.GetCollectionType()), ParameterMode.ReturnValue) }, Parameters = new[] { new FunctionParameter("param", typeUsage, ParameterMode.Out) } }); var rowTypeProperty1 = new EdmProperty("RTProperty1", typeUsage); var rowTypeProperty2 = new EdmProperty("RTProperty2", typeUsage); var rowType = new RowType(new[] { rowTypeProperty1, rowTypeProperty2 }); var storeFunction = new EdmFunction( "f_s", "Ns.Store", DataSpace.SSpace, new EdmFunctionPayload { ReturnParameters = new[] { new FunctionParameter( "Return", TypeUsage.CreateDefaultTypeUsage(rowType), ParameterMode.ReturnValue) }, Parameters = new[] { new FunctionParameter("param", typeUsage, ParameterMode.Out) } }); var structuralTypeMapping = new Tuple <StructuralType, List <StorageConditionPropertyMapping>, List <StoragePropertyMapping> >( complexType, new List <StorageConditionPropertyMapping>(), new List <StoragePropertyMapping>()); structuralTypeMapping.Item3.Add(new StorageScalarPropertyMapping(complexTypeProperty1, rowTypeProperty1)); structuralTypeMapping.Item3.Add(new StorageScalarPropertyMapping(complexTypeProperty2, rowTypeProperty2)); var functionImportMapping = new FunctionImportMappingComposable( functionImport, storeFunction, new List <Tuple <StructuralType, List <StorageConditionPropertyMapping>, List <StoragePropertyMapping> > > { structuralTypeMapping }); var containerMapping = new StorageEntityContainerMapping(new EntityContainer("C", DataSpace.SSpace)); containerMapping.AddFunctionImportMapping(functionImportMapping); var fixture = new Fixture(); fixture.Writer.WriteEntityContainerMappingElement(containerMapping); Assert.Equal( @"<EntityContainerMapping StorageEntityContainer="""" CdmEntityContainer=""C""> <FunctionImportMapping FunctionName=""Ns.Store.f_s"" FunctionImportName=""f_c""> <ResultMapping> <ComplexTypeMapping TypeName=""Ns.CT""> <ScalarProperty Name=""CTProperty1"" ColumnName=""RTProperty1"" /> <ScalarProperty Name=""CTProperty2"" ColumnName=""RTProperty2"" /> </ComplexTypeMapping> </ResultMapping> </FunctionImportMapping> </EntityContainerMapping>", fixture.ToString()); }