internal IEdmTypeReference EnsureTypeReference(ResourceType resourceType, List <KeyValuePair <string, object> > customAnnotations) { switch (resourceType.ResourceTypeKind) { case ResourceTypeKind.EntityType: { bool?andRemoveNullableFacet = MetadataProviderUtils.GetAndRemoveNullableFacet(customAnnotations); bool nullable = andRemoveNullableFacet.HasValue ? andRemoveNullableFacet.Value : true; return(this.EnsureSchemaType(resourceType).ToTypeReference(nullable)); } case ResourceTypeKind.ComplexType: { bool? nullable2 = MetadataProviderUtils.GetAndRemoveNullableFacet(customAnnotations); bool flag2 = this.GetDataServiceVersion() >= RequestDescription.Version3Dot0; Version edmVersion = this.GetEdmVersion(); if ((edmVersion != null) && (edmVersion < MetadataEdmSchemaVersion.Version3Dot0.ToVersion())) { flag2 = false; } bool flag3 = nullable2.HasValue ? nullable2.Value : flag2; return(this.EnsureSchemaType(resourceType).ToTypeReference(flag3)); } case ResourceTypeKind.Primitive: return(MetadataProviderUtils.CreatePrimitiveTypeReference(resourceType, customAnnotations)); case ResourceTypeKind.Collection: return(this.EnsurePrimitiveOrComplexCollectionType(resourceType, customAnnotations).ToTypeReference(true)); case ResourceTypeKind.EntityCollection: return(this.EnsureEntityCollectionType(resourceType, customAnnotations).ToTypeReference(true)); } throw new InvalidOperationException(System.Data.Services.Strings.MetadataProviderEdmModel_UnsupportedResourceTypeKind(resourceType.ResourceTypeKind.ToString())); }
private IEdmCollectionType EnsureCollectionItemTypeIsPrimitiveOrComplex(ResourceType itemResourceType, List <KeyValuePair <string, object> > customAnnotations) { IEdmCollectionType type; if (!this.primitiveOrComplexCollectionTypeCache.TryGetValue(itemResourceType, out type)) { IEdmTypeReference reference; switch (itemResourceType.ResourceTypeKind) { case ResourceTypeKind.ComplexType: reference = this.EnsureTypeReference(itemResourceType, customAnnotations); reference = reference.IsNullable ? reference.Clone(false) : reference; break; case ResourceTypeKind.Primitive: { MetadataProviderUtils.GetAndRemoveNullableFacet(customAnnotations); IEdmPrimitiveTypeReference typeReference = MetadataProviderUtils.CreatePrimitiveTypeReference(itemResourceType, customAnnotations); reference = typeReference.IsNullable ? typeReference.Clone(false) : typeReference; break; } default: throw new InvalidOperationException(System.Data.Services.Strings.MetadataProviderEdmModel_UnsupportedCollectionItemType_PrimitiveOrComplex(itemResourceType.ResourceTypeKind.ToString())); } type = new EdmCollectionType(reference); this.primitiveOrComplexCollectionTypeCache.Add(itemResourceType, type); } return(type); }
internal IEdmSchemaType EnsureSchemaType(ResourceType resourceType) { IEdmSchemaType type; ResourceTypeKind resourceTypeKind = resourceType.ResourceTypeKind; if (resourceTypeKind == ResourceTypeKind.Primitive) { return(MetadataProviderUtils.CreatePrimitiveTypeReference(resourceType).PrimitiveDefinition()); } string typeNamespace = this.GetTypeNamespace(resourceType); string key = ComputeSchemaTypeCacheKey(typeNamespace, resourceType); if (this.schemaTypeCache.TryGetValue(key, out type)) { return(type); } switch (resourceTypeKind) { case ResourceTypeKind.EntityType: return(this.AddEntityType(resourceType, typeNamespace)); case ResourceTypeKind.ComplexType: return(this.AddComplexType(resourceType, typeNamespace)); } throw new InvalidOperationException(System.Data.Services.Strings.MetadataProviderEdmModel_UnsupportedSchemaTypeKind(resourceTypeKind.ToString())); }
private IEdmProperty CreateProperty(EdmStructuredType declaringType, ResourceProperty resourceProperty) { IEdmProperty property; List <KeyValuePair <string, object> > annotations = (resourceProperty.CustomAnnotations == null) ? null : resourceProperty.CustomAnnotations.ToList <KeyValuePair <string, object> >(); ODataNullValueBehaviorKind nullValueReadBehaviorKind = ODataNullValueBehaviorKind.Default; if (resourceProperty.IsOfKind(ResourcePropertyKind.Primitive) || resourceProperty.IsOfKind(ResourcePropertyKind.Stream)) { IEdmPrimitiveTypeReference typeReference = MetadataProviderUtils.CreatePrimitiveTypeReference(resourceProperty.ResourceType, annotations); if (resourceProperty.IsOfKind(ResourcePropertyKind.Key)) { if (typeReference.IsNullable) { typeReference = (IEdmPrimitiveTypeReference)typeReference.Clone(false); } nullValueReadBehaviorKind = ODataNullValueBehaviorKind.IgnoreValue; } else if (MetadataProviderUtils.ShouldDisablePrimitivePropertyNullValidation(resourceProperty, typeReference)) { nullValueReadBehaviorKind = ODataNullValueBehaviorKind.DisableValidation; } string andRemoveDefaultValue = MetadataProviderUtils.GetAndRemoveDefaultValue(annotations); EdmConcurrencyMode concurrencyMode = resourceProperty.IsOfKind(ResourcePropertyKind.ETag) ? EdmConcurrencyMode.Fixed : EdmConcurrencyMode.None; property = declaringType.AddStructuralProperty(resourceProperty.Name, typeReference, andRemoveDefaultValue, concurrencyMode); string mimeType = resourceProperty.MimeType; if (!string.IsNullOrEmpty(mimeType)) { this.SetMimeType(property, mimeType); } } else if (resourceProperty.IsOfKind(ResourcePropertyKind.ComplexType)) { IEdmTypeReference reference2 = this.EnsureTypeReference(resourceProperty.ResourceType, annotations); string defaultValue = MetadataProviderUtils.GetAndRemoveDefaultValue(annotations); property = declaringType.AddStructuralProperty(resourceProperty.Name, reference2, defaultValue, EdmConcurrencyMode.None); if (this.metadataProvider.IsV1Provider && !reference2.IsNullable) { nullValueReadBehaviorKind = ODataNullValueBehaviorKind.DisableValidation; } } else if (resourceProperty.IsOfKind(ResourcePropertyKind.Collection)) { string str4 = MetadataProviderUtils.GetAndRemoveDefaultValue(annotations); IEdmTypeReference reference3 = this.EnsureTypeReference(resourceProperty.ResourceType, annotations); property = declaringType.AddStructuralProperty(resourceProperty.Name, reference3, str4, EdmConcurrencyMode.None); } else { if (!resourceProperty.IsOfKind(ResourcePropertyKind.ResourceSetReference) && !resourceProperty.IsOfKind(ResourcePropertyKind.ResourceReference)) { throw new InvalidOperationException(System.Data.Services.Strings.MetadataProviderEdmModel_UnsupportedResourcePropertyKind(resourceProperty.Kind.ToString())); } EdmEntityType type = (EdmEntityType)declaringType; IEdmTypeReference reference4 = resourceProperty.IsOfKind(ResourcePropertyKind.ResourceSetReference) ? this.EnsureEntityPrimitiveOrComplexCollectionTypeReference(resourceProperty.ResourceType, annotations) : this.EnsureTypeReference(resourceProperty.ResourceType, annotations); property = new MetadataProviderEdmNavigationProperty(type, resourceProperty.Name, reference4); type.AddProperty(property); } this.SetNullValueReaderBehavior(property, nullValueReadBehaviorKind); MetadataProviderUtils.ConvertCustomAnnotations(this, annotations, property); return(property); }