public void BuildNavigationLink_ReturnsNull(bool followsConventions, ODataMetadataLevel metadataLevel) { // Arrange var navigationProperty = _entitySet.EntityType.AddNavigationProperty(typeof(Customer).GetProperty("Orders"), EdmMultiplicity.Many); IEdmModel model = _modelBuilder.GetEdmModel(); IEdmNavigationProperty edmNavProperty = model.GetEdmTypeReference(typeof(Customer)).AsEntity().DeclaredNavigationProperties().Single(p => p.Name == "Orders"); NavigationSourceLinkBuilderAnnotation linkBuilder = new NavigationSourceLinkBuilderAnnotation(_entitySet); linkBuilder.AddNavigationPropertyLinkBuilder(edmNavProperty, new NavigationLinkBuilder((context, property) => new Uri("http://navigationlink"), followsConventions)); // Act Uri generatedNavigationLink = linkBuilder.BuildNavigationLink(new ResourceContext(), edmNavProperty, (ODataMetadataLevel)metadataLevel); // Assert Assert.Null(generatedNavigationLink); }
public void CanConfigureReadLinkToNotFollowConventions() { // Arrange Uri idLink = new Uri("http://id_link"); Uri readLink = new Uri("http://read_link"); _entitySet.HasIdLink(new SelfLinkBuilder <Uri>((ctxt) => idLink, followsConventions: true)); _entitySet.HasReadLink(new SelfLinkBuilder <Uri>((ctxt) => readLink, followsConventions: false)); // Act var selfLinks = new NavigationSourceLinkBuilderAnnotation(_entitySet).BuildEntitySelfLinks(new ResourceContext(), ODataMetadataLevel.MinimalMetadata); // Assert Assert.Null(selfLinks.IdLink); Assert.Null(selfLinks.EditLink); Assert.Equal(readLink, selfLinks.ReadLink); }
private static Uri GetNestedNextPageLink(ODataSerializerContext writeContext, int pageSize) { Contract.Assert(writeContext.ExpandedEntity != null); IEdmNavigationSource sourceNavigationSource = writeContext.ExpandedEntity.NavigationSource; NavigationSourceLinkBuilderAnnotation linkBuilder = writeContext.Model.GetNavigationSourceLinkBuilder(sourceNavigationSource); Uri navigationLink = linkBuilder.BuildNavigationLink(writeContext.ExpandedEntity, writeContext.NavigationProperty); if (navigationLink != null) { // return ODataQueryOptions.GetNextPageLink(navigationLink, pageSize); throw new NotImplementedException("ODataQueryOptions"); } return(null); }
private static Uri GetNestedNextPageLink(ODataSerializerContext writeContext, int pageSize) { Contract.Assert(writeContext.ExpandedResource != null); IEdmNavigationSource sourceNavigationSource = writeContext.ExpandedResource.NavigationSource; NavigationSourceLinkBuilderAnnotation linkBuilder = writeContext.Model.GetNavigationSourceLinkBuilder(sourceNavigationSource); Uri navigationLink = linkBuilder.BuildNavigationLink(writeContext.ExpandedResource, writeContext.NavigationProperty); if (navigationLink != null) { // TODO: //return HttpRequestMessageExtensions.GetNextPageLink(navigationLink, pageSize); } return(null); }
public void HasNavigationPropertyLink_SetsIdLinkBuilder() { // Arrange EdmModel model = new EdmModel(); NavigationLinkBuilder linkBuilder = new NavigationLinkBuilder( (ResourceContext a, IEdmNavigationProperty b) => new Uri("http://orders"), followsConventions: false); // Act model.HasNavigationPropertyLink(Customers, OrdersNavigationProperty, linkBuilder); // Assert NavigationSourceLinkBuilderAnnotation annotation = model.GetNavigationSourceLinkBuilder(Customers); Uri uri = annotation.BuildNavigationLink(new ResourceContext(), OrdersNavigationProperty); Assert.Equal(uri, new Uri("http://orders")); }
private static Uri GetNestedNextPageLink(ODataSerializerContext writeContext, int pageSize, object obj) { Contract.Assert(writeContext.ExpandedResource != null); Uri navigationLink; IEdmNavigationSource sourceNavigationSource = writeContext.ExpandedResource.NavigationSource; NavigationSourceLinkBuilderAnnotation linkBuilder = writeContext.Model.GetNavigationSourceLinkBuilder(sourceNavigationSource); // In Contained Navigation, we don't have navigation property binding, // Hence we cannot get the NavigationLink from the NavigationLinkBuilder if (writeContext.NavigationSource.NavigationSourceKind() == EdmNavigationSourceKind.ContainedEntitySet) { // Contained navigation. Uri idlink = linkBuilder.BuildIdLink(writeContext.ExpandedResource); var link = idlink.ToString() + "/" + writeContext.NavigationProperty.Name; navigationLink = new Uri(link); } else { // Non-Contained navigation. navigationLink = linkBuilder.BuildNavigationLink(writeContext.ExpandedResource, writeContext.NavigationProperty); } Uri nestedNextLink = GenerateQueryFromExpandedItem(writeContext, navigationLink); SkipTokenHandler nextLinkGenerator = null; if (writeContext.QueryContext != null) { nextLinkGenerator = writeContext.QueryContext.GetSkipTokenHandler(); } if (nestedNextLink != null) { if (nextLinkGenerator != null) { return(nextLinkGenerator.GenerateNextPageLink(nestedNextLink, pageSize, obj, writeContext)); } return(GetNextPageHelper.GetNextPageLink(nestedNextLink, pageSize)); } return(null); }
public static NavigationSourceLinkBuilderAnnotation GetEntitySetLinkBuilder(this IEdmModel model, IEdmEntitySet entitySet) { if (model == null) { throw Error.ArgumentNull("model"); } NavigationSourceLinkBuilderAnnotation annotation = model.GetAnnotationValue <NavigationSourceLinkBuilderAnnotation>(entitySet); if (annotation == null) { // construct and set an entity set link builder that follows OData URL conventions. annotation = new NavigationSourceLinkBuilderAnnotation(entitySet, model); model.SetEntitySetLinkBuilder(entitySet, annotation); } return(annotation); }
public void Ctor_FollowingConventions_GeneratesNavigationLinkWithCast_ForDerivedNavigationProperty() { // Arrange CustomersModelWithInheritance model = new CustomersModelWithInheritance(); var request = RequestFactory.CreateFromModel(model.Model); ODataSerializerContext serializerContext = ODataSerializerContextFactory.Create(model.Model, model.Customers, request); ResourceContext instanceContext = new ResourceContext(serializerContext, model.SpecialCustomer.AsReference(), new { ID = 42 }); IEdmNavigationProperty ordersProperty = model.SpecialCustomer.NavigationProperties().First(p => p.Name == "SpecialOrders"); // Act NavigationSourceLinkBuilderAnnotation linkBuilder = new NavigationSourceLinkBuilderAnnotation(model.Customers, model.Model); linkBuilder.AddNavigationPropertyLinkBuilder(ordersProperty, new NavigationLinkBuilder((context, property) => context.GenerateNavigationPropertyLink(property, includeCast: true), false)); Uri result = linkBuilder.BuildNavigationLink(instanceContext, ordersProperty, ODataMetadataLevel.MinimalMetadata); // Assert Assert.Equal("http://localhost/Customers(42)/NS.SpecialCustomer/SpecialOrders", result.AbsoluteUri); }
public void BuildReadLink_WhenReadLinkIsNotSameAsEditLink(bool followsConventions, ODataMetadataLevel metadataLevel, bool linkEmitted) { // Arrange _entitySet.HasReadLink(new SelfLinkBuilder <Uri>((context) => new Uri("http://readlink/"), followsConventions)); NavigationSourceLinkBuilderAnnotation linkBuilder = new NavigationSourceLinkBuilderAnnotation(_entitySet); // Act Uri generatedReadLink = linkBuilder.BuildReadLink(new ResourceContext(), metadataLevel, new Uri("http://editLink")); // Assert if (linkEmitted) { Assert.Equal("http://readlink/", generatedReadLink.AbsoluteUri); } else { Assert.Null(generatedReadLink); } }
public void BuildIdLink(bool followsConventions, ODataMetadataLevel metadataLevel, bool linkEmitted) { // Arrange _entitySet.HasIdLink(new SelfLinkBuilder <Uri>((context) => new Uri("http://selflink"), followsConventions)); NavigationSourceLinkBuilderAnnotation linkBuilder = new NavigationSourceLinkBuilderAnnotation(_entitySet); // Act Uri generatedIdLink = linkBuilder.BuildIdLink(new ResourceContext(), (ODataMetadataLevel)metadataLevel); // Assert if (linkEmitted) { Assert.Equal(new Uri("http://selflink"), generatedIdLink); } else { Assert.Null(generatedIdLink); } }
public static NavigationSourceLinkBuilderAnnotation GetNavigationSourceLinkBuilder(this IEdmModel model, IEdmNavigationSource navigationSource) { if (model == null) { throw Error.ArgumentNull("model"); } var annotation = model .GetAnnotationValue <NavigationSourceLinkBuilderAnnotation>(navigationSource); if (annotation == null) { // construct and set a navigation source link builder that follows OData URL conventions. annotation = new NavigationSourceLinkBuilderAnnotation(navigationSource, model); model.SetNavigationSourceLinkBuilder(navigationSource, annotation); } return(annotation); }
internal Uri GenerateLocationHeader() { EntityInstanceContext entityContext = CreateEntityInstanceContext(Request, Entity); Contract.Assert(entityContext != null); NavigationSourceLinkBuilderAnnotation linkBuilder = entityContext.EdmModel.GetNavigationSourceLinkBuilder(entityContext.NavigationSource); Contract.Assert(linkBuilder != null); Uri idLink = linkBuilder.BuildIdLink(entityContext, ODataMetadataLevel.Default); Uri editLink = linkBuilder.BuildEditLink(entityContext, ODataMetadataLevel.Default, idLink); if (editLink == null) { throw Error.InvalidOperation(SRResources.EditLinkNullForLocationHeader, entityContext.NavigationSource.Name); } return(editLink); }
public void SelfLinksGenerationConvention_Uses_GetByIdWithCast_IfDerivedTypeHasNavigationProperty() { ODataConventionModelBuilder builder = ODataConventionModelBuilderFactory.Create(); var vehicles = builder.EntitySet <Vehicle>("vehicles"); IEdmModel model = builder.GetEdmModel(); IEdmEntitySet vehiclesEdmEntitySet = model.EntityContainer.EntitySets().Single(); IEdmEntityType carType = model.AssertHasEntityType(typeof(Car)); var request = RequestFactory.CreateFromModel(model); NavigationSourceLinkBuilderAnnotation linkBuilder = model.GetNavigationSourceLinkBuilder(vehiclesEdmEntitySet); var serializerContext = ODataSerializerContextFactory.Create(model, vehiclesEdmEntitySet, request); var entityContext = new ResourceContext(serializerContext, carType.AsReference(), new Car { Model = 2009, Name = "Contoso" }); EntitySelfLinks selfLinks = linkBuilder.BuildEntitySelfLinks(entityContext, ODataMetadataLevel.FullMetadata); Assert.Equal("http://localhost/vehicles(Model=2009,Name='Contoso')", selfLinks.IdLink.ToString()); Assert.Equal("http://localhost/vehicles(Model=2009,Name='Contoso')/Microsoft.Test.AspNet.OData.Builder.TestModels.Car", selfLinks.EditLink.ToString()); }
public void SelfLinksGenerationConvention_Uses_GetByIdWithoutCast_IfDerivedTypeDoesnotHaveNavigationProperty() { ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); var motorcycles = builder.EntitySet <Motorcycle>("motorcycles"); IEdmModel model = builder.GetEdmModel(); IEdmEntitySet vehiclesEdmEntitySet = model.EntityContainer.EntitySets().Single(); IEdmEntityType sportbikeType = model.AssertHasEntityType(typeof(SportBike)); HttpRequestMessage request = GetODataRequest(model); NavigationSourceLinkBuilderAnnotation linkBuilder = model.GetNavigationSourceLinkBuilder(vehiclesEdmEntitySet); var serializerContext = new ODataSerializerContext { Model = model, NavigationSource = vehiclesEdmEntitySet, Url = request.GetUrlHelper() }; var entityContext = new EntityInstanceContext(serializerContext, sportbikeType.AsReference(), new SportBike { Model = 2009, Name = "Ninja" }); EntitySelfLinks selfLinks = linkBuilder.BuildEntitySelfLinks(entityContext, ODataMetadataLevel.FullMetadata); Assert.Equal("http://localhost/motorcycles(Model=2009,Name='Ninja')", selfLinks.IdLink.ToString()); }
public void NavigationLinksGenerationConvention_GeneratesLinksWithoutCast_ForBaseProperties() { ODataConventionModelBuilder builder = ODataConventionModelBuilderFactory.Create(); builder.EntitySet <SportBike>("vehicles"); builder.EntitySet <Manufacturer>("manufacturers"); IEdmModel model = builder.GetEdmModel(); IEdmEntitySet vehiclesEdmEntitySet = model.EntityContainer.FindEntitySet("vehicles"); IEdmEntityType sportbikeType = model.AssertHasEntityType(typeof(SportBike)); IEdmNavigationProperty motorcycleManufacturerProperty = sportbikeType.AssertHasNavigationProperty(model, "Manufacturer", typeof(MotorcycleManufacturer), isNullable: true, multiplicity: EdmMultiplicity.ZeroOrOne); var configuration = RoutingConfigurationFactory.Create(); string routeName = "Route"; configuration.MapODataServiceRoute(routeName, null, model); var request = RequestFactory.Create(HttpMethod.Get, "http://localhost", configuration, routeName); NavigationSourceLinkBuilderAnnotation linkBuilder = model.GetNavigationSourceLinkBuilder(vehiclesEdmEntitySet); linkBuilder.AddNavigationPropertyLinkBuilder(motorcycleManufacturerProperty, new NavigationLinkBuilder((context, property) => context.GenerateNavigationPropertyLink(property, includeCast: false), false)); var serializerContext = ODataSerializerContextFactory.Create(model, vehiclesEdmEntitySet, request); var entityContext = new ResourceContext(serializerContext, sportbikeType.AsReference(), new SportBike { Model = 2009, Name = "Ninja" }); // We might get one of these: // http://localhost/vehicles(Model=2009,Name='Ninja')/Manufacturer // http://localhost/vehicles(Name='Ninja',Model=2009)/Manufacturer Uri uri = linkBuilder.BuildNavigationLink(entityContext, motorcycleManufacturerProperty, ODataMetadataLevel.MinimalMetadata); string aboluteUri = uri.AbsoluteUri; Assert.Contains("http://localhost/vehicles(", aboluteUri); Assert.Contains("Model=2009", aboluteUri); Assert.Contains("Name='Ninja'", aboluteUri); Assert.Contains(")/Manufacturer", aboluteUri); }
public void SelfLinksGenerationConvention_Uses_GetByIdWithCast_IfDerivedTypeHasNavigationProperty() { ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); var vehicles = builder.EntitySet <Vehicle>("vehicles"); IEdmModel model = builder.GetEdmModel(); IEdmEntitySet vehiclesEdmEntitySet = model.EntityContainer.EntitySets().Single(); IEdmEntityType carType = model.AssertHasEntityType(typeof(Car)); HttpRequestMessage request = GetODataRequest(model); NavigationSourceLinkBuilderAnnotation linkBuilder = model.GetNavigationSourceLinkBuilder(vehiclesEdmEntitySet); var serializerContext = new ODataSerializerContext { Model = model, NavigationSource = vehiclesEdmEntitySet, Url = request.GetUrlHelper() }; var entityContext = new EntityInstanceContext(serializerContext, carType.AsReference(), new Car { Model = 2009, Name = "Contoso" }); EntitySelfLinks selfLinks = linkBuilder.BuildEntitySelfLinks(entityContext, ODataMetadataLevel.FullMetadata); Assert.Equal("http://localhost/vehicles(Model=2009,Name='Contoso')", selfLinks.IdLink.ToString()); Assert.Equal("http://localhost/vehicles(Model=2009,Name='Contoso')/System.Web.OData.Builder.TestModels.Car", selfLinks.EditLink.ToString()); }
public void SelfLinksGenerationConvention_Uses_WithoutCast_IfDerivedTypeDoesnotHaveNavigationProperty_ForSingleton() { // Arrange ODataConventionModelBuilder builder = ODataConventionModelBuilderFactory.Create(); var myMotorcycle = builder.Singleton <Motorcycle>("MyMotor"); IEdmModel model = builder.GetEdmModel(); IEdmSingleton vehicleEdmSingleton = model.EntityContainer.FindSingleton("MyMotor"); IEdmEntityType sportbikeType = model.AssertHasEntityType(typeof(SportBike)); var request = RequestFactory.CreateFromModel(model); NavigationSourceLinkBuilderAnnotation linkBuilder = model.GetNavigationSourceLinkBuilder(vehicleEdmSingleton); var serializerContext = ODataSerializerContextFactory.Create(model, vehicleEdmSingleton, request); var entityContext = new ResourceContext(serializerContext, sportbikeType.AsReference(), new SportBike { Model = 2014, Name = "Ninja" }); // Act EntitySelfLinks selfLinks = linkBuilder.BuildEntitySelfLinks(entityContext, ODataMetadataLevel.FullMetadata); // Assert Assert.Equal("http://localhost/MyMotor", selfLinks.IdLink.ToString()); }
public void CanConfigureOnIdLinkViaIdLinkFactory() { // Arrange ODataModelBuilder builder = GetCommonModel(); var expectedEditLink = "http://server/service/Products(15)"; var products = builder.EntitySet <EntitySetLinkConfigurationTest_Product>("Products"); products.HasIdLink(c => new Uri(string.Format( "http://server/service/Products({0})", c.GetPropertyValue("ID")) ), followsConventions: false); var actor = builder.EntitySets.Single(); var model = builder.GetEdmModel(); var productType = model.SchemaElements.OfType <IEdmEntityType>().Single(); var productsSet = model.SchemaElements.OfType <IEdmEntityContainer>().Single().EntitySets().Single(); var productInstance = new EntitySetLinkConfigurationTest_Product { ID = 15 }; var serializerContext = new ODataSerializerContext { Model = model, NavigationSource = productsSet }; var entityContext = new ResourceContext(serializerContext, productType.AsReference(), productInstance); var linkBuilderAnnotation = new NavigationSourceLinkBuilderAnnotation(actor); // Act var selfLinks = linkBuilderAnnotation.BuildEntitySelfLinks(entityContext, ODataMetadataLevel.FullMetadata); // Assert Assert.Null(selfLinks.EditLink); Assert.Null(selfLinks.ReadLink); Assert.NotNull(selfLinks.IdLink); Assert.Equal(expectedEditLink, selfLinks.IdLink.ToString()); }
public void NavigationLinksGenerationConvention_GeneratesLinksWithoutCast_ForBaseProperties() { ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); builder.EntitySet <SportBike>("vehicles"); builder.EntitySet <Manufacturer>("manufacturers"); IEdmModel model = builder.GetEdmModel(); IEdmEntitySet vehiclesEdmEntitySet = model.EntityContainer.FindEntitySet("vehicles"); IEdmEntityType sportbikeType = model.AssertHasEntityType(typeof(SportBike)); IEdmNavigationProperty motorcycleManufacturerProperty = sportbikeType.AssertHasNavigationProperty(model, "Manufacturer", typeof(MotorcycleManufacturer), isNullable: true, multiplicity: EdmMultiplicity.ZeroOrOne); HttpConfiguration configuration = new HttpConfiguration(); string routeName = "Route"; configuration.MapODataServiceRoute(routeName, null, model); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost"); request.SetConfiguration(configuration); request.ODataProperties().RouteName = routeName; NavigationSourceLinkBuilderAnnotation linkBuilder = model.GetNavigationSourceLinkBuilder(vehiclesEdmEntitySet); linkBuilder.AddNavigationPropertyLinkBuilder(motorcycleManufacturerProperty, new NavigationLinkBuilder((context, property) => context.GenerateNavigationPropertyLink(property, includeCast: false), false)); var serializerContext = new ODataSerializerContext { Model = model, NavigationSource = vehiclesEdmEntitySet, Url = request.GetUrlHelper() }; var entityContext = new EntityInstanceContext(serializerContext, sportbikeType.AsReference(), new SportBike { Model = 2009, Name = "Ninja" }); Uri uri = linkBuilder.BuildNavigationLink(entityContext, motorcycleManufacturerProperty, ODataMetadataLevel.MinimalMetadata); Assert.Equal("http://localhost/vehicles(Model=2009,Name='Ninja')/Manufacturer", uri.AbsoluteUri); }
public void NavigationLinksGenerationConvention_GeneratesLinksWithCast_ForDerivedProperties() { ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); builder.EntitySet <Vehicle>("vehicles"); builder.EntitySet <Manufacturer>("manufacturers"); IEdmModel model = builder.GetEdmModel(); IEdmEntitySet vehiclesEdmEntitySet = model.EntityContainer.FindEntitySet("vehicles"); IEdmEntityType carType = model.AssertHasEntityType(typeof(Car)); IEdmNavigationProperty carManufacturerProperty = carType.AssertHasNavigationProperty(model, "Manufacturer", typeof(CarManufacturer), isNullable: true, multiplicity: EdmMultiplicity.ZeroOrOne); HttpConfiguration configuration = new HttpConfiguration(); string routeName = "Route"; configuration.MapODataServiceRoute(routeName, null, model); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost"); request.SetConfiguration(configuration); request.EnableODataDependencyInjectionSupport(routeName); NavigationSourceLinkBuilderAnnotation linkBuilder = model.GetNavigationSourceLinkBuilder(vehiclesEdmEntitySet); linkBuilder.AddNavigationPropertyLinkBuilder(carManufacturerProperty, new NavigationLinkBuilder((context, property) => context.GenerateNavigationPropertyLink(property, includeCast: true), false)); var serializerContext = new ODataSerializerContext { Model = model, NavigationSource = vehiclesEdmEntitySet, Url = request.GetUrlHelper() }; var entityContext = new ResourceContext(serializerContext, carType.AsReference(), new Car { Model = 2009, Name = "Accord" }); Uri uri = linkBuilder.BuildNavigationLink(entityContext, carManufacturerProperty, ODataMetadataLevel.MinimalMetadata); Assert.Equal("http://localhost/vehicles(Model=2009,Name='Accord')/System.Web.OData.Builder.TestModels.Car/Manufacturer", uri.AbsoluteUri); }
public void NavigationLinksGenerationConvention_GeneratesLinksWithoutCast_ForDeclaredProperties_OnSingleton() { ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); builder.Singleton <Car>("Contoso"); builder.EntitySet <Manufacturer>("manufacturers"); IEdmModel model = builder.GetEdmModel(); IEdmSingleton vehicleEdmSingleton = model.EntityContainer.FindSingleton("Contoso"); IEdmEntityType carType = model.AssertHasEntityType(typeof(Car)); IEdmNavigationProperty carManufacturerProperty = carType.AssertHasNavigationProperty(model, "Manufacturer", typeof(CarManufacturer), isNullable: true, multiplicity: EdmMultiplicity.ZeroOrOne); HttpConfiguration configuration = new HttpConfiguration(); string routeName = "Route"; configuration.MapODataServiceRoute(routeName, null, model); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost"); request.SetConfiguration(configuration); request.ODataProperties().RouteName = routeName; NavigationSourceLinkBuilderAnnotation linkBuilder = model.GetNavigationSourceLinkBuilder(vehicleEdmSingleton); linkBuilder.AddNavigationPropertyLinkBuilder(carManufacturerProperty, new NavigationLinkBuilder((context, property) => context.GenerateNavigationPropertyLink(property, includeCast: false), false)); var serializerContext = new ODataSerializerContext { Model = model, NavigationSource = vehicleEdmSingleton, Url = request.GetUrlHelper() }; var entityContext = new EntityInstanceContext(serializerContext, carType.AsReference(), new Car { Model = 2014, Name = "Contoso2014" }); Uri uri = linkBuilder.BuildNavigationLink(entityContext, carManufacturerProperty, ODataMetadataLevel.MinimalMetadata); Assert.Equal("http://localhost/Contoso/Manufacturer", uri.AbsoluteUri); }
public void SelfLinksGenerationConvention_Uses_WithCast_IfDerivedTypeHasNavigationProperty_ForSingleton() { // Arrange ODataConventionModelBuilder builder = ODataConventionModelBuilderFactory.Create(); var myVehicle = builder.Singleton <Vehicle>("MyVehicle"); IEdmModel model = builder.GetEdmModel(); IEdmSingleton vehicleEdmSingleton = model.EntityContainer.FindSingleton("MyVehicle"); IEdmEntityType carType = model.AssertHasEntityType(typeof(Car)); var request = RequestFactory.CreateFromModel(model); NavigationSourceLinkBuilderAnnotation linkBuilder = model.GetNavigationSourceLinkBuilder(vehicleEdmSingleton); var serializerContext = ODataSerializerContextFactory.Create(model, vehicleEdmSingleton, request); var entityContext = new ResourceContext(serializerContext, carType.AsReference(), new Car { Model = 2014, Name = "Contoso" }); // Act EntitySelfLinks selfLinks = linkBuilder.BuildEntitySelfLinks(entityContext, ODataMetadataLevel.FullMetadata); // Assert Assert.Equal("http://localhost/MyVehicle", selfLinks.IdLink.ToString()); Assert.Equal("http://localhost/MyVehicle/Microsoft.Test.AspNet.OData.Builder.TestModels.Car", selfLinks.EditLink.ToString()); }
public static void SetEntitySetLinkBuilder(this IEdmModel model, IEdmEntitySet entitySet, NavigationSourceLinkBuilderAnnotation entitySetLinkBuilder) { if (model == null) { throw Error.ArgumentNull("model"); } model.SetAnnotationValue(entitySet, entitySetLinkBuilder); }
/// <summary> /// Creates the <see cref="ODataEntry"/> to be written while writing this entity. /// </summary> /// <param name="selectExpandNode">The <see cref="SelectExpandNode"/> describing the response graph.</param> /// <param name="entityInstanceContext">The context for the entity instance being written.</param> /// <returns>The created <see cref="ODataEntry"/>.</returns> public virtual ODataEntry CreateEntry(SelectExpandNode selectExpandNode, EntityInstanceContext entityInstanceContext) { if (selectExpandNode == null) { throw Error.ArgumentNull("selectExpandNode"); } if (entityInstanceContext == null) { throw Error.ArgumentNull("entityInstanceContext"); } string typeName = entityInstanceContext.EntityType.FullName(); ODataEntry entry = new ODataEntry { TypeName = typeName, Properties = CreateStructuralPropertyBag(selectExpandNode.SelectedStructuralProperties, entityInstanceContext), }; IEnumerable <ODataAction> actions = CreateODataActions(selectExpandNode.SelectedActions, entityInstanceContext); foreach (ODataAction action in actions) { entry.AddAction(action); } IEdmEntityType pathType = GetODataPathType(entityInstanceContext.SerializerContext); AddTypeNameAnnotationAsNeeded(entry, pathType, entityInstanceContext.SerializerContext.MetadataLevel); if (entityInstanceContext.NavigationSource != null) { if (!(entityInstanceContext.NavigationSource is IEdmContainedEntitySet)) { IEdmModel model = entityInstanceContext.SerializerContext.Model; NavigationSourceLinkBuilderAnnotation linkBuilder = model.GetNavigationSourceLinkBuilder(entityInstanceContext.NavigationSource); EntitySelfLinks selfLinks = linkBuilder.BuildEntitySelfLinks(entityInstanceContext, entityInstanceContext.SerializerContext.MetadataLevel); if (selfLinks.IdLink != null) { entry.Id = selfLinks.IdLink; } if (selfLinks.ReadLink != null) { entry.ReadLink = selfLinks.ReadLink; } if (selfLinks.EditLink != null) { entry.EditLink = selfLinks.EditLink; } } string etag = CreateETag(entityInstanceContext); if (etag != null) { entry.ETag = etag; } } return(entry); }
/// <summary> /// Creates the <see cref="ODataResource"/> to be written while writing this resource. /// </summary> /// <param name="selectExpandNode">The <see cref="SelectExpandNode"/> describing the response graph.</param> /// <param name="resourceContext">The context for the resource instance being written.</param> /// <returns>The created <see cref="ODataResource"/>.</returns> public virtual ODataResource CreateResource(SelectExpandNode selectExpandNode, ResourceContext resourceContext) { if (selectExpandNode == null) { throw Error.ArgumentNull("selectExpandNode"); } if (resourceContext == null) { throw Error.ArgumentNull("resourceContext"); } string typeName = resourceContext.StructuredType.FullTypeName(); ODataResource resource = new ODataResource { TypeName = typeName, Properties = CreateStructuralPropertyBag(selectExpandNode.SelectedStructuralProperties, resourceContext), }; // Try to add the dynamic properties if the structural type is open. AppendDynamicProperties(resource, selectExpandNode, resourceContext); IEnumerable <ODataAction> actions = CreateODataActions(selectExpandNode.SelectedActions, resourceContext); foreach (ODataAction action in actions) { resource.AddAction(action); } IEnumerable <ODataFunction> functions = CreateODataFunctions(selectExpandNode.SelectedFunctions, resourceContext); foreach (ODataFunction function in functions) { resource.AddFunction(function); } IEdmStructuredType pathType = GetODataPathType(resourceContext.SerializerContext); if (resourceContext.StructuredType.TypeKind == EdmTypeKind.Complex) { AddTypeNameAnnotationAsNeededForComplex(resource, resourceContext.SerializerContext.MetadataLevel); } else { AddTypeNameAnnotationAsNeeded(resource, pathType, resourceContext.SerializerContext.MetadataLevel); } if (resourceContext.StructuredType.TypeKind == EdmTypeKind.Entity && resourceContext.NavigationSource != null) { if (!(resourceContext.NavigationSource is IEdmContainedEntitySet)) { IEdmModel model = resourceContext.SerializerContext.Model; NavigationSourceLinkBuilderAnnotation linkBuilder = model.GetNavigationSourceLinkBuilder(resourceContext.NavigationSource); EntitySelfLinks selfLinks = linkBuilder.BuildEntitySelfLinks(resourceContext, resourceContext.SerializerContext.MetadataLevel); if (selfLinks.IdLink != null) { resource.Id = selfLinks.IdLink; } if (selfLinks.ReadLink != null) { resource.ReadLink = selfLinks.ReadLink; } if (selfLinks.EditLink != null) { resource.EditLink = selfLinks.EditLink; } } string etag = CreateETag(resourceContext); if (etag != null) { resource.ETag = etag; } } return(resource); }
/// <summary> /// Creates the <see cref="ODataEntry"/> to be written while writing this entity. /// </summary> /// <param name="selectExpandNode">The <see cref="SelectExpandNode"/> describing the response graph.</param> /// <param name="entityInstanceContext">The context for the entity instance being written.</param> /// <returns>The created <see cref="ODataEntry"/>.</returns> public virtual ODataEntry CreateEntry(SelectExpandNode selectExpandNode, EntityInstanceContext entityInstanceContext) { if (selectExpandNode == null) { throw Error.ArgumentNull("selectExpandNode"); } if (entityInstanceContext == null) { throw Error.ArgumentNull("entityInstanceContext"); } string typeName = entityInstanceContext.EntityType.FullName(); ODataEntry entry = new ODataEntry { TypeName = typeName, Properties = CreateStructuralPropertyBag(selectExpandNode.SelectedStructuralProperties, entityInstanceContext), }; // Try to add the dynamic properties if the entity type is open. if ((entityInstanceContext.EntityType.IsOpen && selectExpandNode.SelectAllDynamicProperties) || (entityInstanceContext.EntityType.IsOpen && selectExpandNode.SelectedDynamicProperties.Any())) { IEdmTypeReference entityTypeReference = entityInstanceContext.EntityType.ToEdmTypeReference(isNullable: false); List <ODataProperty> dynamicProperties = AppendDynamicProperties(entityInstanceContext.EdmObject, (IEdmStructuredTypeReference)entityTypeReference, entityInstanceContext.SerializerContext, entry.Properties.ToList(), selectExpandNode.SelectedDynamicProperties.ToArray()); if (dynamicProperties != null) { entry.Properties = entry.Properties.Concat(dynamicProperties); } } IEnumerable <ODataAction> actions = CreateODataActions(selectExpandNode.SelectedActions, entityInstanceContext); foreach (ODataAction action in actions) { entry.AddAction(action); } IEdmEntityType pathType = GetODataPathType(entityInstanceContext.SerializerContext); AddTypeNameAnnotationAsNeeded(entry, pathType, entityInstanceContext.SerializerContext.MetadataLevel); if (entityInstanceContext.NavigationSource != null) { if (!(entityInstanceContext.NavigationSource is IEdmContainedEntitySet)) { IEdmModel model = entityInstanceContext.SerializerContext.Model; NavigationSourceLinkBuilderAnnotation linkBuilder = model.GetNavigationSourceLinkBuilder(entityInstanceContext.NavigationSource); EntitySelfLinks selfLinks = linkBuilder.BuildEntitySelfLinks(entityInstanceContext, entityInstanceContext.SerializerContext.MetadataLevel); if (selfLinks.IdLink != null) { entry.Id = selfLinks.IdLink; } if (selfLinks.ReadLink != null) { entry.ReadLink = selfLinks.ReadLink; } if (selfLinks.EditLink != null) { entry.EditLink = selfLinks.EditLink; } } string etag = CreateETag(entityInstanceContext); if (etag != null) { entry.ETag = etag; } } return(entry); }