public void Singleton_CanOnlyConfigureIdLinkViaIdLinkFactory() { // Arrange ODataModelBuilder builder = GetSingletonModel(); const string ExpectedEditLink = "http://server/service/Exchange"; var product = builder.Singleton<SingletonProduct>("Exchange"); product.HasIdLink(c => new Uri("http://server/service/Exchange"), followsConventions: false); var exchange = builder.Singletons.Single(); var model = builder.GetEdmModel(); var productType = model.SchemaElements.OfType<IEdmEntityType>().Single(); var singleton = model.SchemaElements.OfType<IEdmEntityContainer>().Single().FindSingleton("Exchange"); var singletonInstance = new SingletonProduct { ID = 15 }; var serializerContext = new ODataSerializerContext { Model = model, NavigationSource = singleton }; var entityContext = new EntityInstanceContext(serializerContext, productType.AsReference(), singletonInstance); var linkBuilderAnnotation = new NavigationSourceLinkBuilderAnnotation(exchange); // Act var selfLinks = linkBuilderAnnotation.BuildEntitySelfLinks(entityContext, ODataMetadataLevel.FullMetadata); // Assert Assert.NotNull(selfLinks.IdLink); Assert.Equal(ExpectedEditLink, selfLinks.IdLink.ToString()); Assert.Null(selfLinks.ReadLink); Assert.Null(selfLinks.EditLink); }
internal static Uri GenerateActionLink(EntityInstanceContext entityContext, ActionConfiguration action) { // the entity type the action is bound to. EntityTypeConfiguration actionEntityType = action.BindingParameter.TypeConfiguration as EntityTypeConfiguration; Contract.Assert(actionEntityType != null, "we have already verified that binding paramter type is entity"); List<ODataPathSegment> actionPathSegments = new List<ODataPathSegment>(); actionPathSegments.Add(new EntitySetPathSegment(entityContext.EntitySet)); actionPathSegments.Add(new KeyValuePathSegment(ConventionsHelpers.GetEntityKeyValue(entityContext))); // generate link with cast if the entityset type doesn't match the entity type the action is bound to. if (!entityContext.EntitySet.ElementType.IsOrInheritsFrom(entityContext.EdmModel.FindDeclaredType(actionEntityType.FullName))) { actionPathSegments.Add(new CastPathSegment(entityContext.EntityType)); } actionPathSegments.Add(new ActionPathSegment(action.Name)); string actionLink = entityContext.Url.ODataLink(actionPathSegments); if (actionLink == null) { return null; } return new Uri(actionLink); }
internal static Uri GenerateSelfLink(EntitySetConfiguration configuration, EntityInstanceContext entityContext, bool includeCast) { string routeName; Dictionary<string, object> routeValues = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase); routeValues.Add(LinkGenerationConstants.Controller, configuration.Name); routeValues.Add(LinkGenerationConstants.Id, ConventionsHelpers.GetEntityKeyValue(entityContext, configuration.EntityType)); if (includeCast) { routeName = ODataRouteNames.GetByIdWithCast; routeValues.Add(LinkGenerationConstants.Entitytype, entityContext.EntityType.FullName()); } else { routeName = ODataRouteNames.GetById; } string editLink = entityContext.UrlHelper.Link(routeName, routeValues); if (editLink == null) { throw Error.InvalidOperation(SRResources.GetByIdRouteMissingOrIncorrect, routeName); } return new Uri(editLink); }
public void CanConfigureAllLinksViaEditLink() { // Arrange ODataModelBuilder builder = GetCommonModel(); var expectedEditLink = "http://server/service/Products(15)"; var products = builder.EntitySet<EntitySetLinkConfigurationTest_Product>("Products"); products.HasEditLink(c => new Uri( string.Format( "http://server/service/Products({0})", c.EntityInstance.ID ) )); 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 entityContext = new EntityInstanceContext { EdmModel = model, EntitySet = productsSet, EntityType = productType, EntityInstance = productInstance, UrlHelper = new UrlHelper(new HttpRequestMessage()) }; var entitySetLinkBuilderAnnotation = new EntitySetLinkBuilderAnnotation(actor); // Act var editLinkUri = entitySetLinkBuilderAnnotation.BuildEditLink(entityContext); var readLinkUri = entitySetLinkBuilderAnnotation.BuildReadLink(entityContext); var idLink = entitySetLinkBuilderAnnotation.BuildIdLink(entityContext); // Assert Assert.NotNull(editLinkUri); Assert.Equal(expectedEditLink, editLinkUri.ToString()); Assert.NotNull(readLinkUri); Assert.Equal(expectedEditLink, readLinkUri.ToString()); Assert.NotNull(idLink); Assert.Equal(expectedEditLink, idLink); }
public void Ctor_ThatBuildsNestedContext_CopiesProperties() { // Arrange CustomersModelWithInheritance model = new CustomersModelWithInheritance(); ODataSerializerContext context = new ODataSerializerContext { EntitySet = model.Customers, MetadataLevel = ODataMetadataLevel.FullMetadata, Model = model.Model, Path = new ODataPath(), Request = new HttpRequestMessage(), RootElementName = "somename", SelectExpandClause = new SelectExpandClause(new SelectItem[0], allSelected: true), SkipExpensiveAvailabilityChecks = true, Url = new UrlHelper() }; EntityInstanceContext entity = new EntityInstanceContext { SerializerContext = context }; SelectExpandClause selectExpand = new SelectExpandClause(new SelectItem[0], allSelected: true); IEdmNavigationProperty navProp = model.Customer.NavigationProperties().First(); // Act ODataSerializerContext nestedContext = new ODataSerializerContext(entity, selectExpand, navProp); // Assert Assert.Equal(context.MetadataLevel, nestedContext.MetadataLevel); Assert.Same(context.Model, nestedContext.Model); Assert.Same(context.Path, nestedContext.Path); Assert.Same(context.Request, nestedContext.Request); Assert.Equal(context.RootElementName, nestedContext.RootElementName); Assert.Equal(context.SkipExpensiveAvailabilityChecks, nestedContext.SkipExpensiveAvailabilityChecks); Assert.Same(context.Url, nestedContext.Url); }
public void Apply_Doesnot_Override_UserConfiguration() { ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); var vehicles = builder.EntitySet<Vehicle>("vehicles"); var car = builder.AddEntityType(typeof(Car)); var paintAction = vehicles.EntityType.Action("Paint"); paintAction.HasActionLink(ctxt => new Uri("http://localhost/ActionTestWorks"), followsConventions: false); ActionLinkGenerationConvention convention = new ActionLinkGenerationConvention(); convention.Apply(paintAction, builder); IEdmModel model = builder.GetEdmModel(); var vehiclesEdmSet = model.EntityContainer.FindEntitySet("vehicles"); var carEdmType = model.FindDeclaredType("System.Web.OData.Builder.TestModels.Car") as IEdmEntityType; var paintEdmAction = model.GetAvailableProcedures( model.FindDeclaredType("System.Web.OData.Builder.TestModels.Car") as IEdmEntityType).Single() as IEdmAction; Assert.NotNull(paintEdmAction); HttpConfiguration configuration = new HttpConfiguration(); configuration.Routes.MapODataServiceRoute(model); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost"); request.SetConfiguration(configuration); ActionLinkBuilder actionLinkBuilder = model.GetActionLinkBuilder(paintEdmAction); var serializerContext = new ODataSerializerContext { Model = model, NavigationSource = vehiclesEdmSet, Url = request.GetUrlHelper() }; var entityContext = new EntityInstanceContext(serializerContext, carEdmType.AsReference(), new Car { Model = 2009, Name = "Contoso" }); Uri link = actionLinkBuilder.BuildActionLink(entityContext); Assert.Equal("http://localhost/ActionTestWorks", link.AbsoluteUri); }
internal static Uri GenerateActionLink(EntityInstanceContext entityContext, ActionConfiguration action) { // the entity type the action is bound to. EntityTypeConfiguration actionEntityType = action.BindingParameter.TypeConfiguration as EntityTypeConfiguration; Contract.Assert(actionEntityType != null, "we have already verified that binding paramter type is entity"); Dictionary<string, object> routeValues = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase); routeValues.Add(LinkGenerationConstants.Controller, entityContext.EntitySet.Name); routeValues.Add(LinkGenerationConstants.BoundId, ConventionsHelpers.GetEntityKeyValue(entityContext, actionEntityType)); routeValues.Add(LinkGenerationConstants.ODataAction, action.Name); string routeName; // generate link without cast if the entityset type matches the entity type the action is bound to. if (entityContext.EntitySet.ElementType.IsOrInheritsFrom(entityContext.EdmModel.FindDeclaredType(actionEntityType.FullName))) { routeName = ODataRouteNames.InvokeBoundAction; } else { routeName = ODataRouteNames.InvokeBoundActionWithCast; routeValues.Add(LinkGenerationConstants.Entitytype, entityContext.EntityType.FullName()); } string actionLink = entityContext.UrlHelper.Link(routeName, routeValues); if (actionLink == null) { return null; } else { return new Uri(actionLink); } }
public void CanConfigureAllLinksViaIdLink() { // Arrange ODataModelBuilder builder = GetCommonModel(); var expectedEditLink = "http://server/service/Products(15)"; var products = builder.EntitySet<EntitySetLinkConfigurationTest_Product>("Products"); products.HasIdLink(c => 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, EntitySet = productsSet }; var entityContext = new EntityInstanceContext(serializerContext, productType.AsReference(), productInstance); var entitySetLinkBuilderAnnotation = new EntitySetLinkBuilderAnnotation(actor); // Act var selfLinks = entitySetLinkBuilderAnnotation.BuildEntitySelfLinks(entityContext, ODataMetadataLevel.Default); // Assert Assert.NotNull(selfLinks.EditLink); Assert.Equal(expectedEditLink, selfLinks.EditLink.ToString()); Assert.NotNull(selfLinks.ReadLink); Assert.Equal(expectedEditLink, selfLinks.ReadLink.ToString()); Assert.NotNull(selfLinks.IdLink); Assert.Equal(expectedEditLink, selfLinks.IdLink); }
/// <summary> /// Initializes a new instance of the <see cref="ODataSerializerContext"/> class. /// </summary> /// <param name="entity">The entity whose navigation property is being expanded.</param> /// <param name="selectExpandClause">The <see cref="SelectExpandClause"/> for the navigation property being expanded.</param> /// <param name="navigationProperty">The navigation property being expanded.</param> /// <remarks>This constructor is used to construct the serializer context for writing expanded properties.</remarks> public ODataSerializerContext(EntityInstanceContext entity, SelectExpandClause selectExpandClause, IEdmNavigationProperty navigationProperty) { if (entity == null) { throw Error.ArgumentNull("entity"); } if (navigationProperty == null) { throw Error.ArgumentNull("navigationProperty"); } ODataSerializerContext context = entity.SerializerContext; Request = context.Request; Url = context.Url; EntitySet = context.EntitySet; Model = context.Model; Path = context.Path; RootElementName = context.RootElementName; SkipExpensiveAvailabilityChecks = context.SkipExpensiveAvailabilityChecks; MetadataLevel = context.MetadataLevel; ExpandedEntity = entity; SelectExpandClause = selectExpandClause; NavigationProperty = navigationProperty; EntitySet = context.EntitySet.FindNavigationTarget(navigationProperty); }
public void Convention_GeneratesUri_ForActionBoundToEntity() { // Arrange ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); builder.EntitySet<Customer>("Customers"); var action = builder.EntityType<Customer>().Action("MyAction"); action.Parameter<string>("param"); IEdmModel model = builder.GetEdmModel(); // Act HttpConfiguration configuration = new HttpConfiguration(); configuration.MapODataServiceRoute("odata", "odata", model); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:123"); request.SetConfiguration(configuration); request.ODataProperties().RouteName = "odata"; IEdmEntitySet customers = model.EntityContainer.FindEntitySet("Customers"); var edmType = model.SchemaElements.OfType<IEdmEntityType>().First(e => e.Name == "Customer"); var serializerContext = new ODataSerializerContext { Model = model, NavigationSource = customers, Url = request.GetUrlHelper() }; var entityContext = new EntityInstanceContext(serializerContext, edmType.AsReference(), new Customer { Id = 109 }); // Assert var edmAction = model.SchemaElements.OfType<IEdmAction>().First(f => f.Name == "MyAction"); Assert.NotNull(edmAction); ActionLinkBuilder actionLinkBuilder = model.GetActionLinkBuilder(edmAction); Uri link = actionLinkBuilder.BuildActionLink(entityContext); Assert.Equal("http://localhost:123/odata/Customers(109)/Default.MyAction", link.AbsoluteUri); }
public void GenerateActionLink_GeneratesLinkWithoutCast_IfEntitySetTypeMatchesActionEntityType() { // Arrange ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); var cars = builder.EntitySet<Car>("cars"); var paintAction = cars.EntityType.Action("Paint"); IEdmModel model = builder.GetEdmModel(); var carsEdmSet = model.EntityContainers().Single().FindEntitySet("cars"); HttpConfiguration configuration = new HttpConfiguration(); string routeName = "Route"; configuration.Routes.MapODataRoute(routeName, null, model); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost"); request.SetConfiguration(configuration); request.SetODataRouteName(routeName); var serializerContext = new ODataSerializerContext { Model = model, EntitySet = carsEdmSet, Url = request.GetUrlHelper() }; var entityContext = new EntityInstanceContext(serializerContext, carsEdmSet.ElementType.AsReference(), new Car { Model = 2009, Name = "Accord" }); // Act Uri link = ActionLinkGenerationConvention.GenerateActionLink(entityContext, paintAction); Assert.Equal("http://localhost/cars(Model=2009,Name='Accord')/Paint", link.AbsoluteUri); }
public virtual EntitySelfLinks BuildEntitySelfLinks(EntityInstanceContext instanceContext, ODataMetadataLevel metadataLevel) { EntitySelfLinks selfLinks = new EntitySelfLinks(); selfLinks.IdLink = BuildIdLink(instanceContext, metadataLevel); selfLinks.EditLink = BuildEditLink(instanceContext, metadataLevel, selfLinks.IdLink); selfLinks.ReadLink = BuildReadLink(instanceContext, metadataLevel, selfLinks.EditLink); return selfLinks; }
public override Uri BuildEditLink(EntityInstanceContext instanceContext, ODataMetadataLevel metadataLevel, string idLink) { if (EditLinkBuilder != null) { return EditLinkBuilder.Factory(instanceContext); } return null; }
public override string BuildIdLink(EntityInstanceContext instanceContext, ODataMetadataLevel metadataLevel) { if (IdLinkBuilder != null) { return IdLinkBuilder.Factory(instanceContext); } return null; }
public void GenerateSelfLink_ThrowsArgument_IfUrlHelperIsNull() { EntityInstanceContext context = new EntityInstanceContext(); Assert.ThrowsArgument( () => LinkGenerationHelpers.GenerateSelfLink(context, includeCast: false), "entityContext", "The property 'Url' of EntityInstanceContext cannot be null."); }
public override Uri BuildReadLink(EntityInstanceContext instanceContext, ODataMetadataLevel metadataLevel, Uri editLink) { if (ReadLinkBuilder != null) { return ReadLinkBuilder.Factory(instanceContext); } return null; }
public string GetLink(EntityInstanceContext entityContext) { if (_linkFactory == null) { throw Error.NotSupported(SRResources.CreatingLinksByConventionNotSupported); } return _linkFactory(entityContext); }
/// <summary> /// Builds the procedure link for the given entity. /// </summary> /// <param name="context">An instance context wrapping the entity instance.</param> /// <returns>The generated link.</returns> public virtual Uri BuildLink(EntityInstanceContext context) { if (_linkFactory == null) { return null; } return _linkFactory(context); }
public override Uri BuildNavigationLink(EntityInstanceContext context, IEdmNavigationProperty navigationProperty, ODataMetadataLevel metadataLevel) { if (NavigationLinkBuilder != null) { return NavigationLinkBuilder(context, navigationProperty, metadataLevel); } return null; }
public void GenerateSelfLink_GeneratesExpectedSelfLink(bool includeCast, string expectedIdLink) { HttpRequestMessage request = GetODataRequest(_model.Model); var serializerContext = new ODataSerializerContext { Model = _model.Model, EntitySet = _model.Customers, Url = request.GetUrlHelper() }; var entityContext = new EntityInstanceContext(serializerContext, _model.SpecialCustomer.AsReference(), new { ID = 42 }); string idLink = entityContext.GenerateSelfLink(includeCast); Assert.Equal(expectedIdLink, idLink); }
public void GenerateNavigationPropertyLink_ThrowsArgument_IfUrlHelperIsNull() { IEdmNavigationProperty navigationProperty = new Mock<IEdmNavigationProperty>().Object; EntityInstanceContext context = new EntityInstanceContext(); Assert.ThrowsArgument( () => LinkGenerationHelpers.GenerateNavigationPropertyLink(context, navigationProperty, includeCast: false), "entityContext", "The property 'Url' of EntityInstanceContext cannot be null."); }
public void GenerateNavigationLink_GeneratesExpectedNavigationLink(bool includeCast, string expectedNavigationLink) { HttpRequestMessage request = GetODataRequest(_model.Model); var serializerContext = new ODataSerializerContext { Model = _model.Model, EntitySet = _model.Customers, Url = request.GetUrlHelper() }; var entityContext = new EntityInstanceContext(serializerContext, _model.SpecialCustomer.AsReference(), new { ID = 42 }); IEdmNavigationProperty ordersProperty = _model.Customer.NavigationProperties().Single(); Uri uri = entityContext.GenerateNavigationPropertyLink(ordersProperty, includeCast); Assert.Equal(expectedNavigationLink, uri.AbsoluteUri); }
public void CanConfigureLinksIndependently() { // Arrange ODataModelBuilder builder = GetCommonModel(); var expectedEditLink = "http://server1/service/Products(15)"; var expectedReadLink = "http://server2/service/Products/15"; var expectedIdLink = "http://server3/service/Products(15)"; var products = builder.EntitySet<EntitySetLinkConfigurationTest_Product>("Products"); products.HasEditLink(c => new Uri( string.Format( "http://server1/service/Products({0})", c.GetPropertyValue("ID") ) ), followsConventions: false); products.HasReadLink(c => new Uri( string.Format( "http://server2/service/Products/15", c.GetPropertyValue("ID") ) ), followsConventions: false); products.HasIdLink(c => new Uri(string.Format( "http://server3/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 EntityInstanceContext(serializerContext, productType.AsReference(), productInstance); // Act var editLink = actor.GetEditLink().Factory(entityContext); var readLink = actor.GetReadLink().Factory(entityContext); var idLink = actor.GetIdLink().Factory(entityContext); // Assert Assert.NotNull(editLink); Assert.Equal(expectedEditLink, editLink.ToString()); Assert.NotNull(readLink); Assert.Equal(expectedReadLink, readLink.ToString()); Assert.NotNull(idLink); Assert.Equal(expectedIdLink, idLink.ToString()); }
public void GenerateSelfLink_WorksToGenerateExpectedSelfLink_ForSingleton(bool includeCast, string expectedIdLink) { // Arrange HttpRequestMessage request = GetODataRequest(_model.Model); var serializerContext = new ODataSerializerContext { Model = _model.Model, NavigationSource = _model.Mary, Url = request.GetUrlHelper() }; var entityContext = new EntityInstanceContext(serializerContext, _model.SpecialCustomer.AsReference(), new { ID = 42 }); // Act var idLink = entityContext.GenerateSelfLink(includeCast); // Assert Assert.Equal(expectedIdLink, idLink.ToString()); }
public virtual Uri BuildReadLink(EntityInstanceContext context) { if (context == null) { throw Error.ArgumentNull("context"); } if (_readLinkBuilderFunc == null) { return BuildEditLink(context); } return _readLinkBuilderFunc(context); }
public virtual Uri BuildEditLink(EntityInstanceContext context) { if (context == null) { throw Error.ArgumentNull("context"); } if (_editLinkBuilder == null) { throw Error.InvalidOperation(SRResources.NoEditLinkFactoryFound, _entitySet.Name); } return _editLinkBuilder(context); }
public virtual string BuildIdLink(EntityInstanceContext context) { if (context == null) { throw Error.ArgumentNull("context"); } if (_idLinkBuilder == null) { return BuildEditLink(context).ToString(); } return _idLinkBuilder(context); }
private void WriteEntry(object graph, IEnumerable<ODataProperty> propertyBag, ODataWriter writer, ODataSerializerContext writeContext) { IEdmEntityType entityType = _edmEntityTypeReference.EntityDefinition(); EntityInstanceContext entityInstanceContext = new EntityInstanceContext { EdmModel = SerializerProvider.EdmModel, EntitySet = writeContext.EntitySet, EntityType = entityType, UrlHelper = writeContext.UrlHelper, PathHandler = writeContext.PathHandler, EntityInstance = graph, SkipExpensiveAvailabilityChecks = writeContext.SkipExpensiveAvailabilityChecks }; ODataEntry entry = new ODataEntry { TypeName = _edmEntityTypeReference.FullName(), Properties = propertyBag, Actions = CreateActions(entityInstanceContext) }; if (writeContext.EntitySet != null) { IEntitySetLinkBuilder linkBuilder = SerializerProvider.EdmModel.GetEntitySetLinkBuilder(writeContext.EntitySet); string idLink = linkBuilder.BuildIdLink(entityInstanceContext); if (idLink != null) { entry.Id = idLink; } Uri readLink = linkBuilder.BuildReadLink(entityInstanceContext); if (readLink != null) { entry.ReadLink = readLink; } Uri editLink = linkBuilder.BuildEditLink(entityInstanceContext); if (editLink != null) { entry.EditLink = editLink; } } writer.WriteStart(entry); WriteNavigationLinks(entityInstanceContext, writer, writeContext); writer.WriteEnd(); }
public void GetEntityKeyValue_SingleKey_DifferentDataTypes(object value, object expectedValue) { // Arrange EdmEntityType entityType = new EdmEntityType("NS", "Name"); entityType.AddKeys(entityType.AddStructuralProperty("Property", EdmPrimitiveTypeKind.String)); var entityInstance = new { Property = value }; EntityInstanceContext entityInstanceContext = new EntityInstanceContext(_writeContext, entityType.AsReference(), entityInstance); // Act var keyValue = ConventionsHelpers.GetEntityKeyValue(entityInstanceContext); // Assert Assert.Equal(expectedValue, keyValue); }
public override ODataEntry CreateEntry(SelectExpandNode selectExpandNode, EntityInstanceContext entityInstanceContext) { var entry = base.CreateEntry(selectExpandNode, entityInstanceContext); var instance = entityInstanceContext.EntityInstance as T; if (instance != null) { entry.MediaResource = new ODataStreamReferenceValue { ContentType = ContentType, ReadLink = BuildLinkForStreamProperty(instance, entityInstanceContext) }; } return(entry); }
internal static IList <ODataPathSegment> GenerateBaseODataPathSegments(this EntityInstanceContext entityContext) { IList <ODataPathSegment> odataPath = new List <ODataPathSegment>(); if (entityContext.NavigationSource.NavigationSourceKind() == EdmNavigationSourceKind.Singleton) { odataPath.Add(new SingletonPathSegment((IEdmSingleton)entityContext.NavigationSource)); } else { odataPath.Add(new EntitySetPathSegment((IEdmEntitySetBase)entityContext.NavigationSource)); odataPath.Add(new KeyValuePathSegment(ConventionsHelpers.GetEntityKeyValue(entityContext))); } return(odataPath); }
public void GenerateNavigationLink_WorksToGenerateExpectedNavigationLink_ForSingleton(bool includeCast, string expectedNavigationLink) { // Arrange HttpRequestMessage request = GetODataRequest(_model.Model); var serializerContext = new ODataSerializerContext { Model = _model.Model, NavigationSource = _model.Mary, Url = request.GetUrlHelper() }; var entityContext = new EntityInstanceContext(serializerContext, _model.SpecialCustomer.AsReference(), new { ID = 42 }); IEdmNavigationProperty ordersProperty = _model.Customer.NavigationProperties().Single(); // Act Uri uri = entityContext.GenerateNavigationPropertyLink(ordersProperty, includeCast); // Assert Assert.Equal(expectedNavigationLink, uri.AbsoluteUri); }
public void GenerateActionLink_GeneratesLinkWithDownCast_IfElementTypeDerivesFromBindingParameterType_ForSingleton() { // Arrange IEdmSingleton me = new EdmSingleton(_model.Container, "Me", _model.SpecialCustomer); HttpRequestMessage request = GetODataRequest(_model.Model); var serializerContext = new ODataSerializerContext { Model = _model.Model, NavigationSource = me, Url = request.GetUrlHelper() }; var entityContext = new EntityInstanceContext(serializerContext, _model.SpecialCustomer.AsReference(), new { ID = 42 }); // Act Uri link = entityContext.GenerateActionLink(_model.UpgradeCustomer); // Assert Assert.Equal("http://localhost/Me/NS.Customer/upgrade", link.AbsoluteUri); }
public override ODataEntry CreateEntry( SelectExpandNode selectExpandNode, EntityInstanceContext entityInstanceContext) { if (selectExpandNode == null) { throw new ArgumentNullException("selectExpandNode"); } if (entityInstanceContext == null) { throw new ArgumentNullException("entityInstanceContext"); } var entry = base.CreateEntry(selectExpandNode, entityInstanceContext); var context = entityInstanceContext.SerializerContext; // if the model doesn't have a stream, then this isn't a media link entry if (!entityInstanceContext.EntityType.HasStream) { return(entry); } var entity = entityInstanceContext.EntityInstance; // must have an entity if (entity == null) { return(entry); } // get the metadata provider associated with the current request var provider = entityInstanceContext.Request.GetMediaStreamReferenceProvider(); // need metadata to construct the media link enty if (provider == null) { return(entry); } // attach the media link entry var mediaResource = provider.GetMediaStreamReference(entityInstanceContext, context); entry.MediaResource = mediaResource; return(entry); }
private void WriteExpandedNavigationProperty( KeyValuePair <IEdmNavigationProperty, SelectExpandClause> navigationPropertyToExpand, EntityInstanceContext entityInstanceContext, ODataWriter writer) { Contract.Assert(entityInstanceContext != null); Contract.Assert(writer != null); IEdmNavigationProperty navigationProperty = navigationPropertyToExpand.Key; SelectExpandClause selectExpandClause = navigationPropertyToExpand.Value; object propertyValue = entityInstanceContext.GetPropertyValue(navigationProperty.Name); if (propertyValue == null) { if (navigationProperty.Type.IsCollection()) { // A navigation property whose Type attribute specifies a collection, the collection always exists, // it may just be empty. // If a collection of entities can be related, it is represented as a JSON array. An empty // collection of entities (one that contains no entities) is represented as an empty JSON array. writer.WriteStart(new ODataFeed()); } else { // If at most one entity can be related, the value is null if no entity is currently related. writer.WriteStart(entry: null); } writer.WriteEnd(); } else { // create the serializer context for the expanded item. ODataSerializerContext nestedWriteContext = new ODataSerializerContext(entityInstanceContext, selectExpandClause, navigationProperty); // write object. ODataEdmTypeSerializer serializer = SerializerProvider.GetEdmTypeSerializer(navigationProperty.Type); if (serializer == null) { throw new SerializationException( Error.Format(SRResources.TypeCannotBeSerialized, navigationProperty.Type.ToTraceString(), typeof(ODataMediaTypeFormatter).Name)); } serializer.WriteObjectInline(propertyValue, navigationProperty.Type, writer, nestedWriteContext); } }
/// <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), Actions = CreateODataActions(selectExpandNode.SelectedActions, entityInstanceContext) }; AddTypeNameAnnotationAsNeeded(entry, entityInstanceContext.EntitySet, entityInstanceContext.SerializerContext.MetadataLevel); if (entityInstanceContext.EntitySet != null) { IEdmModel model = entityInstanceContext.SerializerContext.Model; EntitySetLinkBuilderAnnotation linkBuilder = model.GetEntitySetLinkBuilder(entityInstanceContext.EntitySet); 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; } } return(entry); }
public void GetEntityKeyValue_ThrowsForNullKeys_WithMultipleKeys() { // Arrange var entityInstance = new { Key1 = "abc", Key2 = "def", Key3 = (string)null }; EdmEntityType entityType = new EdmEntityType("NS", "Name"); entityType.AddKeys(entityType.AddStructuralProperty("Key1", EdmPrimitiveTypeKind.String)); entityType.AddKeys(entityType.AddStructuralProperty("Key2", EdmPrimitiveTypeKind.Int32)); entityType.AddKeys(entityType.AddStructuralProperty("Key3", EdmPrimitiveTypeKind.Boolean)); EntityInstanceContext entityInstanceContext = new EntityInstanceContext(_writeContext, entityType.AsReference(), entityInstance); // Act & Assert Assert.Throws <InvalidOperationException>( () => ConventionsHelpers.GetEntityKeyValue(entityInstanceContext), "Key property 'Key3' of type 'NS.Name' is null. Key properties cannot have null values."); }
internal static IList <ODataPathSegment> GenerateBaseODataPathSegments(this EntityInstanceContext entityContext) { IList <ODataPathSegment> odataPath = new List <ODataPathSegment>(); if (entityContext.NavigationSource.NavigationSourceKind() == EdmNavigationSourceKind.Singleton) { // Per the OData V4 specification, a singleton is expected to be a child of the entity container, and // as a result we can make the assumption that it is the only segment in the generated path. odataPath.Add(new SingletonPathSegment((IEdmSingleton)entityContext.NavigationSource)); } else { GenerateBaseODataPathSegmentsForNonSingletons(entityContext, odataPath); } return(odataPath); }
public override ODataEntry CreateEntry(SelectExpandNode selectExpandNode, EntityInstanceContext entityInstanceContext) { ODataEntry entry = base.CreateEntry(selectExpandNode, entityInstanceContext); Request item = entityInstanceContext.EntityInstance as Request; if (entry != null && item != null) { // add your "NotMapped" property here. entry.Properties = new List <ODataProperty>(entry.Properties) { new ODataProperty { Name = "UserName", Value = item.UserName } }; } return(entry); }
public void GetEntityKeyValue_DerivedType() { // Arrange var entityInstance = new { Key = "key" }; EdmEntityType baseEntityType = new EdmEntityType("NS", "Name"); baseEntityType.AddKeys(baseEntityType.AddStructuralProperty("Key", EdmPrimitiveTypeKind.String)); EdmEntityType derivedEntityType = new EdmEntityType("NS", "Derived", baseEntityType); EntityInstanceContext entityInstanceContext = new EntityInstanceContext(_writeContext, derivedEntityType.AsReference(), entityInstance); // Act var keyValue = ConventionsHelpers.GetEntityKeyValue(entityInstanceContext); // Assert Assert.Equal("'key'", keyValue); }
/// <summary> /// Constructs the IdLink for a particular <see cref="EntityInstanceContext" /> and <see cref="ODataMetadataLevel" />. /// </summary> public virtual Uri BuildIdLink(EntityInstanceContext instanceContext, ODataMetadataLevel metadataLevel) { if (instanceContext == null) { throw Error.ArgumentNull("instanceContext"); } if (_idLinkBuilder != null && (metadataLevel == ODataMetadataLevel.FullMetadata || (metadataLevel == ODataMetadataLevel.MinimalMetadata && !_idLinkBuilder.FollowsConventions))) { return(_idLinkBuilder.Factory(instanceContext)); } // Return null to let ODL decide when and how to build the id link. return(null); }
private void WriteEntry(object graph, ODataWriter writer, ODataSerializerContext writeContext) { Contract.Assert(writeContext != null); IEdmEntityTypeReference entityType = GetEntityType(graph, writeContext); EntityInstanceContext entityInstanceContext = new EntityInstanceContext(writeContext, entityType, graph, null); SelectExpandNode selectExpandNode = CreateSelectExpandNode(entityInstanceContext); if (selectExpandNode != null) { ODataEntry entry = CreateEntry(selectExpandNode, entityInstanceContext); if (entry != null) { WriteNode(writer, entry, selectExpandNode, entityInstanceContext); } } }
public static string GetEntityKeyValue(EntityInstanceContext entityContext, IEntityTypeConfiguration entityTypeConfiguration) { // TODO: BUG 453795: reflection cleanup if (entityTypeConfiguration.Keys.Count() == 1) { return GetUriRepresentationForKeyValue(entityTypeConfiguration.Keys.First().PropertyInfo, entityContext.EntityInstance); } else { return String.Join( ",", entityTypeConfiguration .Keys .Select( key => String.Format(CultureInfo.InvariantCulture, "{0}={1}", key.Name, GetUriRepresentationForKeyValue(key.PropertyInfo, entityContext.EntityInstance)))); } }
public void Ctor_FollowingConventions_GeneratesSelfLinkWithCast_IfDerivedTypeHasNavigationProperty() { // Arrange CustomersModelWithInheritance model = new CustomersModelWithInheritance(); HttpRequestMessage request = GetODataRequest(model.Model); ODataSerializerContext serializerContext = new ODataSerializerContext { Model = model.Model, NavigationSource = model.Customers, Url = request.GetUrlHelper() }; EntityInstanceContext instanceContext = new EntityInstanceContext(serializerContext, model.SpecialCustomer.AsReference(), new { ID = 42 }); // Act NavigationSourceLinkBuilderAnnotation linkBuilder = new NavigationSourceLinkBuilderAnnotation(model.Customers, model.Model); var result = linkBuilder.BuildIdLink(instanceContext, ODataMetadataLevel.Default); // Assert Assert.Equal("http://localhost/Customers(42)/NS.SpecialCustomer", result.ToString()); }
public static string GetEntityKeyValue(EntityInstanceContext entityContext, EntityTypeConfiguration entityTypeConfiguration) { // TODO: BUG 453795: reflection cleanup if (entityTypeConfiguration.Keys().Count() == 1) { return(GetUriRepresentationForKeyValue(entityTypeConfiguration.Keys().First().PropertyInfo, entityContext.EntityInstance, entityTypeConfiguration)); } else { return(String.Join( ",", entityTypeConfiguration .Keys() .Select( key => String.Format(CultureInfo.InvariantCulture, "{0}={1}", key.Name, GetUriRepresentationForKeyValue(key.PropertyInfo, entityContext.EntityInstance, entityTypeConfiguration))))); } }
public void GenerateFunctionLink_GeneratesLinkWithDownCast_IfElementTypeDerivesFromBindingParameterType() { // Arrange IEdmEntitySet specialCustomers = new EdmEntitySet(_model.Container, "SpecialCustomers", _model.SpecialCustomer); HttpRequestMessage request = GetODataRequest(_model.Model); var serializerContext = new ODataSerializerContext { Model = _model.Model, NavigationSource = specialCustomers, Url = request.GetUrlHelper() }; var entityContext = new EntityInstanceContext(serializerContext, _model.SpecialCustomer.AsReference(), new { ID = 42 }); // Act Uri link = entityContext.GenerateFunctionLink(_model.IsCustomerUpgraded); // Assert Assert.Equal("http://localhost/SpecialCustomers(42)/NS.Customer/IsUpgradedWithParam(entity=@entity,city=@city)", link.AbsoluteUri); }
private async Task <IEnumerable <ODataAction> > CreateODataActionsAsync( IEnumerable <IEdmAction> actions, EntityInstanceContext entityInstanceContext) { Contract.Assert(actions != null); Contract.Assert(entityInstanceContext != null); List <ODataAction> result = new List <ODataAction>(); foreach (IEdmAction action in actions) { ODataAction oDataAction = await CreateODataActionAsync(action, entityInstanceContext); if (oDataAction != null) { result.Add(oDataAction); } } return(result); }
public void Ctor_FollowingConventions_GeneratesNavigationLinkWithCast_ForDerivedNavigationProperty() { // Arrange CustomersModelWithInheritance model = new CustomersModelWithInheritance(); HttpRequestMessage request = GetODataRequest(model.Model); ODataSerializerContext serializerContext = new ODataSerializerContext { Model = model.Model, NavigationSource = model.Customers, Url = request.GetUrlHelper() }; EntityInstanceContext instanceContext = new EntityInstanceContext(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); Uri result = linkBuilder.BuildNavigationLink(instanceContext, ordersProperty, ODataMetadataLevel.Default); // Assert Assert.Equal("http://localhost/Customers(42)/NS.SpecialCustomer/SpecialOrders", result.AbsoluteUri); }
/// <summary> /// Creates the collection of <see cref="ODataProperty" />s to be written while writing this entity. /// </summary> /// <param name="entityInstanceContext">The context for the entity instance being written.</param> /// <param name="writeContext">The serializer write context.</param> /// <returns>The collection of properties to be written.</returns> public virtual IEnumerable <ODataProperty> CreateStructuralPropertyBag(EntityInstanceContext entityInstanceContext, ODataSerializerContext writeContext) { if (entityInstanceContext == null) { throw Error.ArgumentNull("entityInstanceContext"); } IEnumerable <IEdmStructuralProperty> edmProperties = EntityType.StructuralProperties(); List <ODataProperty> properties = new List <ODataProperty>(); foreach (IEdmStructuralProperty property in edmProperties) { properties.Add(CreateStructuralProperty(property, entityInstanceContext.EntityInstance, writeContext)); } return(properties); }
public void GetEntityKeyValue_MultipleKeys() { // Arrange var entityInstance = new { Key1 = "key1", Key2 = 2, Key3 = true }; EdmEntityType entityType = new EdmEntityType("NS", "Name"); entityType.AddKeys(entityType.AddStructuralProperty("Key1", EdmPrimitiveTypeKind.String)); entityType.AddKeys(entityType.AddStructuralProperty("Key2", EdmPrimitiveTypeKind.Int32)); entityType.AddKeys(entityType.AddStructuralProperty("Key3", EdmPrimitiveTypeKind.Boolean)); EntityInstanceContext entityInstanceContext = new EntityInstanceContext(_writeContext, entityType.AsReference(), entityInstance); // Act var keyValue = ConventionsHelpers.GetEntityKeyValue(entityInstanceContext); // Assert Assert.Equal("Key1='key1',Key2=2,Key3=true", keyValue); }
public void GetEntityKeyValue_MultipleKeys_ForDateAndTimeOfDay() { // Arrange var entityInstance = new { Key1 = new Date(2015, 12, 2), Key2 = new TimeOfDay(4, 3, 2, 1) }; EdmEntityType entityType = new EdmEntityType("NS", "Name"); entityType.AddKeys(entityType.AddStructuralProperty("Key1", EdmPrimitiveTypeKind.Date)); entityType.AddKeys(entityType.AddStructuralProperty("Key2", EdmPrimitiveTypeKind.TimeOfDay)); EntityInstanceContext entityInstanceContext = new EntityInstanceContext(_writeContext, entityType.AsReference(), entityInstance); // Act var keyValue = ConventionsHelpers.GetEntityKeyValue(entityInstanceContext); // Assert Assert.Equal("Key1=2015-12-02,Key2=04:03:02.0010000", keyValue); }
private async Task <IEnumerable <ODataNavigationLink> > CreateNavigationLinksAsync( IEnumerable <IEdmNavigationProperty> navigationProperties, EntityInstanceContext entityInstanceContext) { Contract.Assert(navigationProperties != null); Contract.Assert(entityInstanceContext != null); List <ODataNavigationLink> result = new List <ODataNavigationLink>(); foreach (IEdmNavigationProperty navProperty in navigationProperties) { ODataNavigationLink navigationLink = await CreateNavigationLinkAsync(navProperty, entityInstanceContext); if (navigationLink != null) { result.Add(navigationLink); } } return(result); }
public void Ctor_FollowingConventions_GeneratesSelfLinkWithoutCast_IfDerivedTypesHaveNoNavigationProperty() { // Arrange CustomersModelWithInheritance model = new CustomersModelWithInheritance(); IEdmEntitySet specialCustomers = new EdmEntitySet(model.Container, "SpecialCustomers", model.SpecialCustomer); HttpRequestMessage request = GetODataRequest(model.Model); ODataSerializerContext serializerContext = new ODataSerializerContext { Model = model.Model, EntitySet = specialCustomers, Url = request.GetUrlHelper() }; EntityInstanceContext instanceContext = new EntityInstanceContext(serializerContext, model.Customer.AsReference(), new { ID = 42 }); // Act EntitySetLinkBuilderAnnotation linkBuilder = new EntitySetLinkBuilderAnnotation(specialCustomers, model.Model); string result = linkBuilder.BuildIdLink(instanceContext, ODataMetadataLevel.Default); // Assert Assert.Equal("http://localhost/SpecialCustomers(42)", result); }
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.Default); Assert.Equal("http://localhost/vehicles(Model=2009,Name='Contoso')/System.Web.OData.Builder.TestModels.Car", selfLinks.IdLink); }
public void BuildFunctionLink_ForFeed_ReturnsLink() { // Arrange FunctionLinkBuilder builder = new FunctionLinkBuilder((FeedContext a) => new Uri("http://localhost:456"), followsConventions: true); EntityInstanceContext entityContext = new EntityInstanceContext(); FeedContext feedContext = new FeedContext(); // Act Uri link = builder.BuildFunctionLink(entityContext); Uri feedLink = builder.BuildFunctionLink(feedContext); // Assert Assert.Null(link); Assert.NotNull(feedLink); Assert.Equal("http://localhost:456/", feedLink.AbsoluteUri); }
public void GetEntityKeyValue_MultipleKeys_DerivedType_ForDateAndTimeOfDay() { // Arrange var entityInstance = new { Key1 = new Date(2015, 2, 26), Key2 = new TimeOfDay(1, 2, 3, 4) }; EdmEntityType baseEntityType = new EdmEntityType("NS", "Name"); baseEntityType.AddKeys(baseEntityType.AddStructuralProperty("Key1", EdmPrimitiveTypeKind.Date)); baseEntityType.AddKeys(baseEntityType.AddStructuralProperty("Key2", EdmPrimitiveTypeKind.TimeOfDay)); EdmEntityType derivedEntityType = new EdmEntityType("NS", "Derived", baseEntityType); EntityInstanceContext entityInstanceContext = new EntityInstanceContext(_writeContext, derivedEntityType.AsReference(), entityInstance); // Act var keyValue = ConventionsHelpers.GetEntityKeyValue(entityInstanceContext); // Assert Assert.Equal("Key1=2015-02-26,Key2=01:02:03.0040000", keyValue); }
private static Uri GenerateContainmentODataPathSegments(EntityInstanceContext entityContext, bool isEntityId) { Contract.Assert(entityContext != null); Contract.Assert( entityContext.NavigationSource.NavigationSourceKind() == EdmNavigationSourceKind.ContainedEntitySet); Contract.Assert(entityContext.Request != null); ODataPath path = entityContext.Request.ODataProperties().Path; if (path == null) { throw Error.InvalidOperation(SRResources.ODataPathMissing); } ODL.ODataPath odlPath = path.ODLPath; odlPath = new ContainmentPathBuilder().TryComputeCanonicalContainingPath(odlPath); path = ODataPathSegmentTranslator.TranslateODLPathToWebAPIPath( odlPath, entityContext.EdmModel, unresolvedPathSegment: null, id: null, enableUriTemplateParsing: false, parameterAliasNodes: new Dictionary <string, ODL.SingleValueNode>(), queryString: new NameValueCollection()); List <ODataPathSegment> odataPath = path.Segments.ToList(); odataPath.Add(new EntitySetPathSegment((IEdmEntitySetBase)entityContext.NavigationSource)); odataPath.Add(new KeyValuePathSegment(ConventionsHelpers.GetEntityKeyValue(entityContext))); if (!isEntityId) { bool isSameType = entityContext.EntityType == entityContext.NavigationSource.EntityType(); if (!isSameType) { odataPath.Add(new CastPathSegment(entityContext.EntityType)); } } string odataLink = entityContext.Url.CreateODataLink(odataPath); return(odataLink == null ? null : new Uri(odataLink)); }
/// <summary> /// Constructs a ReadLink URL for a particular <see cref="EntityInstanceContext" /> and <see cref="ODataMetadataLevel" />. /// </summary> public virtual Uri BuildReadLink(EntityInstanceContext instanceContext, ODataMetadataLevel metadataLevel, Uri editLink) { if (instanceContext == null) { throw Error.ArgumentNull("instanceContext"); } if (_readLinkBuilder != null && (metadataLevel == ODataMetadataLevel.FullMetadata || (metadataLevel == ODataMetadataLevel.MinimalMetadata && !_readLinkBuilder.FollowsConventions))) { // read link is not the same as edit link. Generate if the client asked for it (full metadata modes) or // if the client cannot infer it (not follow conventions). return(_readLinkBuilder.Factory(instanceContext)); } // Return null to let ODL decide when and how to build the read link. return(null); }
public void Apply_Doesnot_Override_UserConfiguration() { ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); var vehicles = builder.EntitySet <Vehicle>("vehicles"); var car = builder.AddEntityType(typeof(Car)); var paintAction = vehicles.EntityType.Action("Paint"); paintAction.HasActionLink(ctxt => new Uri("http://localhost/ActionTestWorks"), followsConventions: false); ActionLinkGenerationConvention convention = new ActionLinkGenerationConvention(); convention.Apply(paintAction, builder); IEdmModel model = builder.GetEdmModel(); var vehiclesEdmSet = model.EntityContainer.FindEntitySet("vehicles"); var carEdmType = model.FindDeclaredType("System.Web.OData.Builder.TestModels.Car") as IEdmEntityType; var paintEdmAction = model.GetAvailableProcedures( model.FindDeclaredType("System.Web.OData.Builder.TestModels.Car") as IEdmEntityType).Single() as IEdmAction; Assert.NotNull(paintEdmAction); HttpConfiguration configuration = new HttpConfiguration(); configuration.MapODataServiceRoute(model); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost"); request.SetConfiguration(configuration); ActionLinkBuilder actionLinkBuilder = model.GetActionLinkBuilder(paintEdmAction); var serializerContext = new ODataSerializerContext { Model = model, NavigationSource = vehiclesEdmSet, Url = request.GetUrlHelper() }; var entityContext = new EntityInstanceContext(serializerContext, carEdmType.AsReference(), new Car { Model = 2009, Name = "Contoso" }); Uri link = actionLinkBuilder.BuildActionLink(entityContext); Assert.Equal("http://localhost/ActionTestWorks", link.AbsoluteUri); }
private IEnumerable <ODataProperty> CreateStructuralPropertyBag( IEnumerable <IEdmStructuralProperty> structuralProperties, EntityInstanceContext entityInstanceContext) { Contract.Assert(structuralProperties != null); Contract.Assert(entityInstanceContext != null); List <ODataProperty> properties = new List <ODataProperty>(); foreach (IEdmStructuralProperty structuralProperty in structuralProperties) { ODataProperty property = CreateStructuralProperty(structuralProperty, entityInstanceContext); if (property != null) { properties.Add(property); } } return(properties); }