/// <summary> /// Helper method for visiting null or empty properties /// </summary> /// <param name="payloadElement">The property to visit</param> protected override void VisitEmptyOrNullProperty(PropertyInstance payloadElement) { base.VisitEmptyOrNullProperty(payloadElement); var property = this.MetadataStack.Peek() as MemberProperty; var navigation = this.MetadataStack.Peek() as NavigationProperty; if (property != null) { ExceptionUtilities.Assert(payloadElement.Name == property.Name, "Property name mismatch"); payloadElement.AddAnnotationIfNotExist(new MemberPropertyAnnotation() { Property = property }); } else { ExceptionUtilities.CheckObjectNotNull(navigation, "Expected property or navigation, got '{0}'", this.MetadataStack.Peek()); ExceptionUtilities.Assert(payloadElement.Name == navigation.Name, "Property name mismatch"); payloadElement.AddAnnotationIfNotExist(new NavigationPropertyAnnotation() { Property = navigation }); var emptyCollection = payloadElement as EmptyCollectionProperty; if (emptyCollection != null && emptyCollection.Value != null) { emptyCollection.Value.AddAnnotationIfNotExist(new EntitySetAnnotation() { EntitySet = this.CurrentEntitySet.GetRelatedEntitySet(navigation) }); } } }
/// <summary> /// Helper method for visiting properties /// </summary> /// <param name="payloadElement">The property to visit</param> /// <param name="value">The value of the property</param> protected override void VisitProperty(PropertyInstance payloadElement, ODataPayloadElement value) { ExceptionUtilities.CheckArgumentNotNull(payloadElement, "payloadElement"); var property = this.MetadataStack.Peek() as MemberProperty; if (property != null) { ExceptionUtilities.Assert(payloadElement.Name == property.Name, "Property name mismatch"); payloadElement.AddAnnotationIfNotExist(new MemberPropertyAnnotation() { Property = property }); try { this.MetadataStack.Push(property.PropertyType); base.VisitProperty(payloadElement, value); } finally { this.MetadataStack.Pop(); } } else { var navprop = this.MetadataStack.Peek() as NavigationProperty; if (navprop != null) { ExceptionUtilities.Assert(payloadElement.Name == navprop.Name, "Property name mismatch"); try { this.MetadataStack.Push(this.CurrentEntitySet.GetRelatedEntitySet(navprop)); base.VisitProperty(payloadElement, value); } finally { this.MetadataStack.Pop(); } } else { var serviceOperation = this.MetadataStack.OfType <Function>().SingleOrDefault(f => f.Name.Equals(payloadElement.Name, StringComparison.Ordinal)); if (payloadElement.Name.Contains('.')) { // if the action has a name collision with a property in the entity, it will have the <container name>.<action name> in the payload // split the payloadElement.Name and get the last token which will match the function name string lastToken = payloadElement.Name.Split('.').Last(); serviceOperation = this.MetadataStack.OfType <Function>().SingleOrDefault(f => f.Name.Equals(lastToken, StringComparison.Ordinal)); } ExceptionUtilities.CheckObjectNotNull(serviceOperation, "Expected property, got " + this.MetadataStack.Peek().ToString()); // Non-entity values returned from a service operation call appear identical to member properties, // with the operation name as the property name base.VisitProperty(payloadElement, value); } } }