/// <summary> /// Returns true if the specified <paramref name="flag"/> is set in the <paramref name="undeclaredPropertyBehaviorKinds"/>. /// </summary> /// <param name="undeclaredPropertyBehaviorKinds">The value of the setting to test.</param> /// <param name="flag">The flag to test.</param> /// <returns>true if the flas is present, flase otherwise.</returns> internal static bool HasFlag(this ODataUndeclaredPropertyBehaviorKinds undeclaredPropertyBehaviorKinds, ODataUndeclaredPropertyBehaviorKinds flag) { DebugUtils.CheckNoExternalCallers(); Debug.Assert(((int)flag | ((int)flag - 1)) + 1 == (int)flag * 2, "Only one flag must be set."); return((undeclaredPropertyBehaviorKinds & flag) == flag); }
/// <summary> /// True if OdataMessgeReaderSettings contain corresponding undeclaredPropertyBehaviorKinds. /// </summary> /// <param name="undeclaredPropertyBehaviorKinds">The enum value of ODataUndeclaredPropertyBehaviorKinds.</param> /// <returns>True if OdataMessgeReaderSettings contain corresponding undeclaredPropertyBehaviorKinds.</returns> public bool ContainUndeclaredPropertyBehavior(ODataUndeclaredPropertyBehaviorKinds undeclaredPropertyBehaviorKinds) { DebugUtils.CheckNoExternalCallers(); if (undeclaredPropertyBehaviorKinds == ODataUndeclaredPropertyBehaviorKinds.None) { return(this.UndeclaredPropertyBehaviorKinds == ODataUndeclaredPropertyBehaviorKinds.None); } return(this.UndeclaredPropertyBehaviorKinds.HasFlag(undeclaredPropertyBehaviorKinds)); }
public PayloadReaderTestDescriptor ToTestDescriptor(PayloadReaderTestDescriptor.Settings settings, IEdmModel model, ODataUndeclaredPropertyBehaviorKinds undeclaredPropertyBehaviorKinds) { var cityType = model.FindDeclaredType("TestModel.CityType").ToTypeReference(); var cities = model.EntityContainer.FindEntitySet("Cities"); EntityInstance entity = PayloadBuilder.Entity("TestModel.CityType").PrimitiveProperty("Id", 1) .ExpectedEntityType(cityType, cities) .JsonRepresentation( "{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#TestModel.DefaultContainer.Cities()/$entity\"," + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataTypeAnnotationName + "\":\"TestModel.CityType\"," + "\"Id\":1," + this.Json + "}"); foreach (PropertyInstance property in this.ExpectedEntity.Properties) { entity.Add(property.DeepCopy()); } ExpectedException expectedException = this.ExpectedException; if (this.IsLink && !undeclaredPropertyBehaviorKinds.HasFlag(ODataUndeclaredPropertyBehaviorKinds.ReportUndeclaredLinkProperty)) { expectedException = ODataExpectedExceptions.ODataException("ValidationUtils_PropertyDoesNotExistOnType", "UndeclaredProperty", "TestModel.CityType"); } if (this.IsValue && !undeclaredPropertyBehaviorKinds.HasFlag(ODataUndeclaredPropertyBehaviorKinds.IgnoreUndeclaredValueProperty)) { expectedException = ODataExpectedExceptions.ODataException("ValidationUtils_PropertyDoesNotExistOnType", "UndeclaredProperty", "TestModel.CityType"); } return(new PayloadReaderTestDescriptor(settings) { DebugDescription = this.DebugDescription, PayloadElement = entity, PayloadEdmModel = model, ExpectedException = expectedException }); }
internal static bool HasFlag(this ODataUndeclaredPropertyBehaviorKinds undeclaredPropertyBehaviorKinds, ODataUndeclaredPropertyBehaviorKinds flag) { return((undeclaredPropertyBehaviorKinds & flag) == flag); }
/// <summary> /// Returns true if the specified <paramref name="flag"/> is set in the <paramref name="undeclaredPropertyBehaviorKinds"/>. /// </summary> /// <param name="undeclaredPropertyBehaviorKinds">The value of the setting to test.</param> /// <param name="flag">The flag to test.</param> /// <returns>true if the flas is present, flase otherwise.</returns> internal static bool HasFlag(this ODataUndeclaredPropertyBehaviorKinds undeclaredPropertyBehaviorKinds, ODataUndeclaredPropertyBehaviorKinds flag) { Debug.Assert(((int)flag | ((int)flag - 1)) + 1 == (int)flag * 2, "Only one flag must be set."); return (undeclaredPropertyBehaviorKinds & flag) == flag; }
/// <summary> /// Returns true if the specified <paramref name="flag"/> is set in the <paramref name="undeclaredPropertyBehaviorKinds"/>. /// </summary> /// <param name="undeclaredPropertyBehaviorKinds">The value of the setting to test.</param> /// <param name="flag">The flag to test.</param> /// <returns>true if the flas is present, flase otherwise.</returns> public static bool HasFlag(this ODataUndeclaredPropertyBehaviorKinds undeclaredPropertyBehaviorKinds, ODataUndeclaredPropertyBehaviorKinds flag) { return (undeclaredPropertyBehaviorKinds & flag) == flag; }
private void RunCombinationsForUndeclaredPropertyBehavior(IEnumerable<PayloadReaderTestDescriptor> testCases, ODataUndeclaredPropertyBehaviorKinds behavior, Func<ReaderTestConfiguration, bool> additionalConfigurationFilter = null) { EdmModel model = new EdmModel(); var entity = new EdmEntityType("TestModel", "EntityType", null, false, true); entity.AddKeys(entity.AddStructuralProperty("Id", EdmCoreModel.Instance.GetInt32(false))); model.AddElement(entity); var complexType = new EdmComplexType("TestModel", "ComplexType"); model.AddElement(complexType); var container = new EdmEntityContainer("TestModel", "DefaultContainer"); container.AddEntitySet("EntitySet", entity); model.AddElement(container); model.Fixup(); var testCaseList = testCases.ToList(); testCaseList.ForEach(t => t.PayloadEdmModel = model); this.CombinatorialEngineProvider.RunCombinations( testCaseList, this.ReaderTestConfigurationProvider.ExplicitFormatConfigurations.Where(tc => !tc.IsRequest && (additionalConfigurationFilter == null || additionalConfigurationFilter(tc))), (testDescriptor, testConfiguration) => { testConfiguration = new ReaderTestConfiguration(testConfiguration); testConfiguration.MessageReaderSettings.UndeclaredPropertyBehaviorKinds = behavior; testDescriptor.RunTest(testConfiguration); }); }
public PayloadReaderTestDescriptor ToTestDescriptor(PayloadReaderTestDescriptor.Settings settings, IEdmModel model, ODataUndeclaredPropertyBehaviorKinds undeclaredPropertyBehaviorKinds) { var cityType = model.FindDeclaredType("TestModel.CityType").ToTypeReference(); var cities = model.EntityContainer.FindEntitySet("Cities"); EntityInstance entity = PayloadBuilder.Entity("TestModel.CityType").PrimitiveProperty("Id", 1) .ExpectedEntityType(cityType, cities) .JsonRepresentation( "{" + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataContextAnnotationName + "\":\"http://odata.org/test/$metadata#TestModel.DefaultContainer.Cities()/$entity\"," + "\"" + JsonLightConstants.ODataPropertyAnnotationSeparator + JsonLightConstants.ODataTypeAnnotationName + "\":\"TestModel.CityType\"," + "\"Id\":1," + this.Json + "}"); foreach (PropertyInstance property in this.ExpectedEntity.Properties) { entity.Add(property.DeepCopy()); } ExpectedException expectedException = this.ExpectedException; if (this.IsLink && !undeclaredPropertyBehaviorKinds.HasFlag(ODataUndeclaredPropertyBehaviorKinds.ReportUndeclaredLinkProperty)) { expectedException = ODataExpectedExceptions.ODataException("ValidationUtils_PropertyDoesNotExistOnType", "UndeclaredProperty", "TestModel.CityType"); } if (this.IsValue && !undeclaredPropertyBehaviorKinds.HasFlag(ODataUndeclaredPropertyBehaviorKinds.IgnoreUndeclaredValueProperty)) { expectedException = ODataExpectedExceptions.ODataException("ValidationUtils_PropertyDoesNotExistOnType", "UndeclaredProperty", "TestModel.CityType"); } return new PayloadReaderTestDescriptor(settings) { DebugDescription = this.DebugDescription, PayloadElement = entity, PayloadEdmModel = model, ExpectedException = expectedException }; }
/// <summary> /// Validates that an open property value is supported. /// </summary> /// <param name="propertyName">The name of the open property.</param> /// <param name="value">The value of the open property.</param> /// <param name="undeclaredPropertyBehaviorKinds">Value of UndeclaredPropertyBehaviorKinds in message settings.</param> internal static void ValidateOpenPropertyValue(string propertyName, object value, ODataUndeclaredPropertyBehaviorKinds undeclaredPropertyBehaviorKinds) { DebugUtils.CheckNoExternalCallers(); Debug.Assert(!string.IsNullOrEmpty(propertyName), "!string.IsNullOrEmpty(propertyName)"); // .None / .LinkProperty bool throwErr = !undeclaredPropertyBehaviorKinds.HasFlag(ODataUndeclaredPropertyBehaviorKinds.IgnoreUndeclaredValueProperty) && !undeclaredPropertyBehaviorKinds.HasFlag(ODataUndeclaredPropertyBehaviorKinds.SupportUndeclaredValueProperty); if (throwErr && value is ODataCollectionValue) { throw new ODataException(Strings.ValidationUtils_OpenCollectionProperty(propertyName)); } if (value is ODataStreamReferenceValue) { throw new ODataException(Strings.ValidationUtils_OpenStreamProperty(propertyName)); } }
private IEnumerable<PayloadReaderTestDescriptor> CreateUndeclaredPropertyTestDescriptors(ODataUndeclaredPropertyBehaviorKinds undeclaredPropertyBehaviorKinds, PayloadReaderTestDescriptor.Settings settings) { IEdmModel model = TestModels.BuildTestModel(); IEnumerable<PayloadReaderTestDescriptor> testDescriptors = undeclaredValueProperties.SelectMany(undeclaredProperty => { if ((undeclaredProperty is PrimitiveProperty) && ((PrimitiveProperty)undeclaredProperty).Value.ClrValue.ToString() == "Microsoft.Data.Spatial.GeographyPointImplementation") { return Enumerable.Empty<PayloadReaderTestDescriptor>(); } EntityInstance inEntity = PayloadBuilder.Entity("TestModel.OfficeType") .PrimitiveProperty("Id", 42); ComplexInstance inComplex = PayloadBuilder.ComplexValue("TestModel.Address") .PrimitiveProperty("Street", "First"); return new[] { // In entry new PayloadReaderTestDescriptor(settings) { PayloadElement = inEntity.DeepCopy().Property(undeclaredProperty.DeepCopy()), ExpectedResultPayloadElement = tc => inEntity.DeepCopy().Property(undeclaredProperty.DeepCopy()), PayloadEdmModel = model, ExpectedException = undeclaredPropertyBehaviorKinds.HasFlag(ODataUndeclaredPropertyBehaviorKinds.IgnoreUndeclaredValueProperty) ? null : ODataExpectedExceptions.ODataException("ValidationUtils_PropertyDoesNotExistOnType", "UndeclaredProperty", "TestModel.OfficeType") }, // In MLE entry new PayloadReaderTestDescriptor(settings) { PayloadElement = PayloadBuilder.Entity("TestModel.CityWithMapType").PrimitiveProperty("Id", 1).AsMediaLinkEntry().Property(undeclaredProperty.DeepCopy()), ExpectedResultPayloadElement = tc => PayloadBuilder.Entity("TestModel.CityWithMapType").PrimitiveProperty("Id", 1).AsMediaLinkEntry().Property(undeclaredProperty.DeepCopy()), PayloadEdmModel = model, ExpectedException = undeclaredPropertyBehaviorKinds.HasFlag(ODataUndeclaredPropertyBehaviorKinds.IgnoreUndeclaredValueProperty) ? null : ODataExpectedExceptions.ODataException("ValidationUtils_PropertyDoesNotExistOnType", "UndeclaredProperty", "TestModel.CityWithMapType") }, }; }); testDescriptors = testDescriptors.Concat(undeclaredLinkProperties.SelectMany(undeclaredProperty => { return new[] { // In entry new PayloadReaderTestDescriptor(settings) { PayloadElement = PayloadBuilder.Entity("TestModel.CityType").PrimitiveProperty("Id", 1).Property(undeclaredProperty.DeepCopy()),// : PayloadEdmModel = model, ExpectedException = undeclaredPropertyBehaviorKinds.HasFlag(ODataUndeclaredPropertyBehaviorKinds.ReportUndeclaredLinkProperty) ? null : ODataExpectedExceptions.ODataException("ValidationUtils_PropertyDoesNotExistOnType", "UndeclaredProperty", "TestModel.CityType") }, // In MLE entry new PayloadReaderTestDescriptor(settings) { PayloadElement = PayloadBuilder.Entity("TestModel.CityWithMapType").PrimitiveProperty("Id", 1).AsMediaLinkEntry().Property(undeclaredProperty.DeepCopy()), //: PayloadEdmModel = model, ExpectedException = undeclaredPropertyBehaviorKinds.HasFlag(ODataUndeclaredPropertyBehaviorKinds.ReportUndeclaredLinkProperty) ? null : ODataExpectedExceptions.ODataException("ValidationUtils_PropertyDoesNotExistOnType", "UndeclaredProperty", "TestModel.CityWithMapType") }, }; })); return testDescriptors; }
private static IEnumerable <PayloadReaderTestDescriptor> CreateUndeclaredPropertyBehaviorKindStreamPropertyTestDescriptors(ODataUndeclaredPropertyBehaviorKinds undeclaredPropertyBehaviorKinds, PayloadReaderTestDescriptor.Settings settings) { IEdmModel model = Microsoft.Test.OData.Utils.Metadata.TestModels.BuildTestModel(); IEnumerable <PayloadReaderTestDescriptor> testDescriptors = new[] { // Undeclared stream property with read-link only. new PayloadReaderTestDescriptor(settings) { PayloadElement = PayloadBuilder.Entity("TestModel.CityType").PrimitiveProperty("Id", 1).StreamProperty("UndeclaredProperty", "http://odata.org/readlink"), PayloadEdmModel = model, ExpectedException = undeclaredPropertyBehaviorKinds.HasFlag(ODataUndeclaredPropertyBehaviorKinds.ReportUndeclaredLinkProperty) ? null : ODataExpectedExceptions.ODataException("ValidationUtils_PropertyDoesNotExistOnType", "UndeclaredProperty", "TestModel.CityType") }, // Undeclared stream property with edit-link only. new PayloadReaderTestDescriptor(settings) { PayloadElement = PayloadBuilder.Entity("TestModel.CityType").PrimitiveProperty("Id", 1).StreamProperty("UndeclaredProperty", null, "http://odata.org/editlink"), PayloadEdmModel = model, ExpectedException = undeclaredPropertyBehaviorKinds.HasFlag(ODataUndeclaredPropertyBehaviorKinds.ReportUndeclaredLinkProperty) ? null : ODataExpectedExceptions.ODataException("ValidationUtils_PropertyDoesNotExistOnType", "UndeclaredProperty", "TestModel.CityType") }, // Undeclared stream property with all properties. new PayloadReaderTestDescriptor(settings) { PayloadElement = PayloadBuilder.Entity("TestModel.CityType").PrimitiveProperty("Id", 1).StreamProperty("UndeclaredProperty", "http://odata.org/readlink", "http://odata.org/editlink", "stream/content", "stream:etag"), PayloadEdmModel = model, ExpectedException = undeclaredPropertyBehaviorKinds.HasFlag(ODataUndeclaredPropertyBehaviorKinds.ReportUndeclaredLinkProperty) ? null : ODataExpectedExceptions.ODataException("ValidationUtils_PropertyDoesNotExistOnType", "UndeclaredProperty", "TestModel.CityType") }, }; return(testDescriptors); }
private static IEnumerable<PayloadReaderTestDescriptor> CreateUndeclaredPropertyBehaviorKindStreamPropertyTestDescriptors(ODataUndeclaredPropertyBehaviorKinds undeclaredPropertyBehaviorKinds, PayloadReaderTestDescriptor.Settings settings) { IEdmModel model = Microsoft.Test.OData.Utils.Metadata.TestModels.BuildTestModel(); IEnumerable<PayloadReaderTestDescriptor> testDescriptors = new[] { // Undeclared stream property with read-link only. new PayloadReaderTestDescriptor(settings) { PayloadElement = PayloadBuilder.Entity("TestModel.CityType").PrimitiveProperty("Id", 1).StreamProperty("UndeclaredProperty", "http://odata.org/readlink"), PayloadEdmModel = model, ExpectedException = undeclaredPropertyBehaviorKinds.HasFlag(ODataUndeclaredPropertyBehaviorKinds.ReportUndeclaredLinkProperty) ? null : ODataExpectedExceptions.ODataException("ValidationUtils_PropertyDoesNotExistOnType", "UndeclaredProperty", "TestModel.CityType") }, // Undeclared stream property with edit-link only. new PayloadReaderTestDescriptor(settings) { PayloadElement = PayloadBuilder.Entity("TestModel.CityType").PrimitiveProperty("Id", 1).StreamProperty("UndeclaredProperty", null, "http://odata.org/editlink"), PayloadEdmModel = model, ExpectedException = undeclaredPropertyBehaviorKinds.HasFlag(ODataUndeclaredPropertyBehaviorKinds.ReportUndeclaredLinkProperty) ? null : ODataExpectedExceptions.ODataException("ValidationUtils_PropertyDoesNotExistOnType", "UndeclaredProperty", "TestModel.CityType") }, // Undeclared stream property with all properties. new PayloadReaderTestDescriptor(settings) { PayloadElement = PayloadBuilder.Entity("TestModel.CityType").PrimitiveProperty("Id", 1).StreamProperty("UndeclaredProperty", "http://odata.org/readlink", "http://odata.org/editlink", "stream/content", "stream:etag"), PayloadEdmModel = model, ExpectedException = undeclaredPropertyBehaviorKinds.HasFlag(ODataUndeclaredPropertyBehaviorKinds.ReportUndeclaredLinkProperty) ? null : ODataExpectedExceptions.ODataException("ValidationUtils_PropertyDoesNotExistOnType", "UndeclaredProperty", "TestModel.CityType") }, }; return testDescriptors; }
/// <summary> /// Validates that a property with the specified name exists on a given structured type. /// The structured type can be null if no metadata is available. /// </summary> /// <param name="propertyName">The name of the property to validate.</param> /// <param name="owningStructuredType">The owning type of the property with name <paramref name="propertyName"/> /// or null if no metadata is available.</param> /// <param name="undeclaredPropertyBehaviorKinds">Value of UndeclaredPropertyBehaviorKinds in message settings.</param> /// <returns>The <see cref="IEdmProperty"/> instance representing the property with name <paramref name="propertyName"/> /// or null if no metadata is available.</returns> internal static IEdmProperty ValidatePropertyDefined(string propertyName, IEdmStructuredType owningStructuredType, ODataUndeclaredPropertyBehaviorKinds undeclaredPropertyBehaviorKinds) { DebugUtils.CheckNoExternalCallers(); Debug.Assert(!string.IsNullOrEmpty(propertyName), "!string.IsNullOrEmpty(propertyName)"); if (owningStructuredType == null) { return(null); } // .None / .LinkProperty bool throwErr = !undeclaredPropertyBehaviorKinds.HasFlag(ODataUndeclaredPropertyBehaviorKinds.IgnoreUndeclaredValueProperty) && !undeclaredPropertyBehaviorKinds.HasFlag(ODataUndeclaredPropertyBehaviorKinds.SupportUndeclaredValueProperty); IEdmProperty property = owningStructuredType.FindProperty(propertyName); // verify that the property is declared if the type is not an open type. if (throwErr && !owningStructuredType.IsOpen && property == null) { throw new ODataException(Strings.ValidationUtils_PropertyDoesNotExistOnType(propertyName, owningStructuredType.ODataFullName())); } return(property); }
internal static IEdmNavigationProperty ValidateNavigationLink( ODataNavigationLink navigationLink, IEdmEntityType declaringEntityType, ODataPayloadKind?expandedPayloadKind, ODataUndeclaredPropertyBehaviorKinds undeclaredPropertyBehaviorKinds) { DebugUtils.CheckNoExternalCallers(); Debug.Assert(navigationLink != null, "navigationLink != null"); Debug.Assert( !expandedPayloadKind.HasValue || expandedPayloadKind.Value == ODataPayloadKind.EntityReferenceLink || expandedPayloadKind.Value == ODataPayloadKind.Entry || expandedPayloadKind.Value == ODataPayloadKind.Feed, "If an expanded payload kind is specified it must be entry, feed or entity reference link."); // Navigation link must have a non-empty name if (string.IsNullOrEmpty(navigationLink.Name)) { throw new ODataException(Strings.ValidationUtils_LinkMustSpecifyName); } // If we write an entity reference link, don't validate the multiplicity of the IsCollection // property if it is 'false' (since we allow writing a singleton navigation link for // a collection navigation property in requests) nor the consistency of payload kind and metadata // (which is done separately in ODataWriterCore.CheckForNavigationLinkWithContent). bool isEntityReferenceLinkPayload = expandedPayloadKind == ODataPayloadKind.EntityReferenceLink; // true only if the expandedPayloadKind has a value and the value is 'Feed' bool isFeedPayload = expandedPayloadKind == ODataPayloadKind.Feed; // Make sure the IsCollection property agrees with the payload kind for entry and feed payloads Func <object, string> errorTemplate = null; if (!isEntityReferenceLinkPayload && navigationLink.IsCollection.HasValue && expandedPayloadKind.HasValue) { // For feed/entry make sure the IsCollection property is set correctly. if (isFeedPayload != navigationLink.IsCollection.Value) { errorTemplate = expandedPayloadKind.Value == ODataPayloadKind.Feed ? (Func <object, string>)Strings.WriterValidationUtils_ExpandedLinkIsCollectionFalseWithFeedContent : Strings.WriterValidationUtils_ExpandedLinkIsCollectionTrueWithEntryContent; } } IEdmNavigationProperty navigationProperty = null; if (errorTemplate == null && declaringEntityType != null) { navigationProperty = WriterValidationUtils.ValidateNavigationPropertyDefined(navigationLink.Name, declaringEntityType, undeclaredPropertyBehaviorKinds); Debug.Assert(navigationProperty != null, "If we have a declaring type we expect a non-null navigation property since open nav props are not allowed."); bool isCollectionType = navigationProperty.Type.TypeKind() == EdmTypeKind.Collection; // Make sure the IsCollection property agrees with the metadata type for entry and feed payloads if (navigationLink.IsCollection.HasValue && isCollectionType != navigationLink.IsCollection) { // Ignore the case where IsCollection is 'false' and we are writing an entity reference link // (see comment above) if (!(navigationLink.IsCollection == false && isEntityReferenceLinkPayload)) { errorTemplate = isCollectionType ? (Func <object, string>)Strings.WriterValidationUtils_ExpandedLinkIsCollectionFalseWithFeedMetadata : Strings.WriterValidationUtils_ExpandedLinkIsCollectionTrueWithEntryMetadata; } } // Make sure that the payload kind agrees with the metadata. // For entity reference links we check separately in ODataWriterCore.CheckForNavigationLinkWithContent. if (!isEntityReferenceLinkPayload && expandedPayloadKind.HasValue && isCollectionType != isFeedPayload) { errorTemplate = isCollectionType ? (Func <object, string>)Strings.WriterValidationUtils_ExpandedLinkWithEntryPayloadAndFeedMetadata : Strings.WriterValidationUtils_ExpandedLinkWithFeedPayloadAndEntryMetadata; } } if (errorTemplate != null) { string uri = navigationLink.Url == null ? "null" : UriUtilsCommon.UriToString(navigationLink.Url); throw new ODataException(errorTemplate(uri)); } return(navigationProperty); }
/// <summary> /// Validates that a navigation property with the specified name exists on a given entity type. /// The entity type can be null if no metadata is available. /// </summary> /// <param name="propertyName">The name of the property to validate.</param> /// <param name="owningEntityType">The owning entity type or null if no metadata is available.</param> /// <param name="undeclaredPropertyBehaviorKinds">Value of UndeclaredPropertyBehaviorKinds in message settings.</param> /// <returns>The <see cref="IEdmProperty"/> instance representing the navigation property with name <paramref name="propertyName"/> /// or null if no metadata is available.</returns> internal static IEdmNavigationProperty ValidateNavigationPropertyDefined(string propertyName, IEdmEntityType owningEntityType, ODataUndeclaredPropertyBehaviorKinds undeclaredPropertyBehaviorKinds) { DebugUtils.CheckNoExternalCallers(); Debug.Assert(!string.IsNullOrEmpty(propertyName), "!string.IsNullOrEmpty(propertyName)"); if (owningEntityType == null) { return(null); } IEdmProperty property = ValidatePropertyDefined(propertyName, owningEntityType, undeclaredPropertyBehaviorKinds); if (property == null) { // .None / .LinkProperty bool throwErr = !undeclaredPropertyBehaviorKinds.HasFlag(ODataUndeclaredPropertyBehaviorKinds.IgnoreUndeclaredValueProperty) && !undeclaredPropertyBehaviorKinds.HasFlag(ODataUndeclaredPropertyBehaviorKinds.SupportUndeclaredValueProperty); // We don't support open navigation properties // when writing undeclared property is supported, shouldn't throw exception if (throwErr) { Debug.Assert(owningEntityType.IsOpen, "We should have already failed on non-existing property on a closed type."); } throw new ODataException(Strings.ValidationUtils_OpenNavigationProperty(propertyName, owningEntityType.ODataFullName())); } if (property.PropertyKind != EdmPropertyKind.Navigation) { // The property must be a navigation property throw new ODataException(Strings.ValidationUtils_NavigationPropertyExpected(propertyName, owningEntityType.ODataFullName(), property.PropertyKind.ToString())); } return((IEdmNavigationProperty)property); }