/// <summary> /// Verifies that CreateEntryReader or CreateFeedReader can be called. /// </summary> /// <param name="entitySet">The entity set we are going to read entities for.</param> /// <param name="entityType">The expected entity type for the entry/entries to be read.</param> private void VerifyCanCreateODataReader(IEdmEntitySet entitySet, IEdmEntityType entityType) { Debug.Assert(entitySet == null || entityType != null, "If an entity set is specified, the entity type must be specified as well."); // We require metadata information for reading requests. if (!this.ReadingResponse) { this.VerifyUserModel(); if (entitySet == null) { throw new ODataException(ODataErrorStrings.ODataJsonLightInputContext_NoEntitySetForRequest); } } // We only check that the base type of the entity set is assignable from the specified entity type. // If no entity set/entity type is specified in the API, we will read it from the metadata URI. IEdmEntityType entitySetElementType = this.EdmTypeResolver.GetElementType(entitySet); if (entitySet != null && entityType != null && !entityType.IsOrInheritsFrom(entitySetElementType)) { throw new ODataException(ODataErrorStrings.ODataJsonLightInputContext_EntityTypeMustBeCompatibleWithEntitySetBaseType(entityType.FullName(), entitySetElementType.FullName(), entitySet.FullName())); } }
/// <summary> /// Resolves an entity set with an optional type cast and updates the parse result. /// </summary> /// <param name="entitySet">The entity set to resolve the type cast against.</param> /// <param name="typeCast">The optional type cast.</param> /// <param name="readerBehavior">Reader behavior if the caller is a reader, null if no reader behavior is available.</param> /// <param name="version">The version of the payload being read.</param> /// <param name="entitySetElementType">The type of the given entity set.</param> /// <returns>The resolved entity type.</returns> private IEdmEntityType ResolveTypeCast(IEdmEntitySet entitySet, string typeCast, ODataReaderBehavior readerBehavior, ODataVersion version, IEdmEntityType entitySetElementType) { Debug.Assert(entitySet != null, "entitySet != null"); IEdmEntityType entityType = entitySetElementType; // Parse the type cast if it exists if (!string.IsNullOrEmpty(typeCast)) { EdmTypeKind typeKind; entityType = MetadataUtils.ResolveTypeNameForRead(this.model, /*expectedType*/ null, typeCast, readerBehavior, version, out typeKind) as IEdmEntityType; if (entityType == null) { throw new ODataException(ODataErrorStrings.ODataJsonLightMetadataUriParser_InvalidEntityTypeInTypeCast(UriUtilsCommon.UriToString(this.parseResult.MetadataUri), typeCast)); } // Validate that the entity type is assignable to the base type of the set if (!entitySetElementType.IsAssignableFrom(entityType)) { throw new ODataException(ODataErrorStrings.ODataJsonLightMetadataUriParser_IncompatibleEntityTypeInTypeCast(UriUtilsCommon.UriToString(this.parseResult.MetadataUri), typeCast, entitySetElementType.FullName(), entitySet.FullName())); } } return(entityType); }