/// <summary> /// Helper method for visiting collections /// </summary> /// <param name="payloadElement">The collection to visit</param> protected override void VisitCollection(ODataPayloadElementCollection payloadElement) { ExceptionUtilities.CheckArgumentNotNull(payloadElement, "payloadElement"); var dataType = this.MetadataStack.Peek() as CollectionDataType; if (dataType != null) { ExceptionUtilities.CheckObjectNotNull(dataType, "Expected collection data type, got '{0}'", this.MetadataStack.Peek()); payloadElement.AddAnnotationIfNotExist(new DataTypeAnnotation() { DataType = dataType }); try { this.MetadataStack.Push(dataType.ElementDataType); base.VisitCollection(payloadElement); } finally { this.MetadataStack.Pop(); } } else { var entitySet = this.MetadataStack.Peek() as EntitySet; ExceptionUtilities.CheckObjectNotNull(entitySet, "Expected entity set, got '{0}'", this.MetadataStack.Peek()); payloadElement.Add(new EntitySetAnnotation() { EntitySet = entitySet }); base.VisitCollection(payloadElement); } }
private void AddExpectedFunctionImportToCollection(ODataPayloadElementCollection collection) { var expectedTypeAnnotation = collection.GetAnnotation<ExpectedTypeODataPayloadElementAnnotation>(); if (expectedTypeAnnotation == null) { expectedTypeAnnotation = new ExpectedTypeODataPayloadElementAnnotation(); collection.Add(expectedTypeAnnotation); } if (expectedTypeAnnotation.ProductFunctionImport == null) { var typeAnnotation = collection.GetAnnotation<EntityModelTypeAnnotation>(); var collectionType = typeAnnotation.EdmModelType; if (this.testDescriptor.PayloadEdmModel != null) { EdmModel model = this.testDescriptor.PayloadEdmModel as EdmModel; EdmEntityContainer container = model.EntityContainer as EdmEntityContainer; var functionImport = container.OperationImports().FirstOrDefault(f => { return f.Operation.ReturnType != null && f.Operation.ReturnType == collectionType; }); if (functionImport == null) { functionImport = container.OperationImports().FirstOrDefault(f => { return f.Operation.ReturnType != null && f.Operation.ReturnType.IsCollection(); }); if (functionImport == null) { var collectionNameAnnotation = collection.GetAnnotation<CollectionNameAnnotation>(); container.AddFunctionAndFunctionImport(model, collectionNameAnnotation == null ? "NewFunctionImport" : collectionNameAnnotation.Name, collectionType); this.testDescriptor.ResetCachedModel(); } } expectedTypeAnnotation.ProductFunctionImport = functionImport as EdmOperationImport; } } }