Navaneeth
Navaneeth

Reputation: 447

dynamic web api odata metadata additional properties

In web api odata that uses v4 protocol, how to add additional attributes?

fully dynamic, no entity framework, no reflection providers,
metadata is dynamically generated when url is called.

Edit
Web Api Request url:
http://locahost/Service1/EntitySet1

Actual json output:

{"@odata.context":"some url", value:[{"id":1}]}  

Expected json response:

{"@odata.context":"some url", value:[{"id":1}], "ExtraCustomAttribute": "custom value"}  

How to add this custom attribute in response web api odata v4 json?

In both metadata call (edmx response) and instance payload call (json response)).

Upvotes: 5

Views: 3514

Answers (1)

Oleg Tamarintsev
Oleg Tamarintsev

Reputation: 43

In OData v4 there are at least two options to implement that behavior: an open type, Instance Annotations. It's depends on your requirements or design decisions.

The open type was added as a stuctured type that contains dynamic properties, in addition to any properties that are declared in the type definition. Open types let you add flexibility to your data models.

This tutorial:

http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/use-open-types-in-odata-v4

shows how to use open types in ASP.NET Web API OData.

Instance Annotations are described here: docs.oasis-open.org/odata/odata-json-format/v4.0/os/odata-json-format-v4.0-os.html#_Toc372793088

In your case try to declare you entity as:

ODataModelBuilder builder = new ODataModelBuilder();

ComplexTypeConfiguration<YourEntity> pressType = builder.ComplexType<YourEntity>();
// ...
pressType.HasDynamicProperties(c => c.ExtraCustomAttribute);
// public IDictionary<string, object> ExtraCustomAttribute{ get; set; }

and in get action method generate entity as you wish. Another option is available to get control over entry serialization, check here

https://aspnetwebstack.codeplex.com/wikipage?title=OData%20formatter%20extensibility

Upvotes: 1

Related Questions