Cloud Platform Integration has enabled OData V4 adapter with which various OData operations can be done on an OData V4 endpoint.
This blog covers the payload structure for various Data modification operations like
- Create
- Deep Insert
- Update
The table below summarizes some of the primitive types and how each MUST be represented when used in a payload.
Primitive Types | Description | Literal form | Sample in payload |
Edm.Boolean | Binary-valued logic | true | true |
Edm.Date | Date without a time-zone offset | date’2014-01-03′ | 2014-01-03 |
Edm.DateTimeOffset | Date and time with a time-zone offset, no leap seconds | datetimeoffset’2014-01-03T10:00:00Z’ | 2014-01-03T10:00:00Z |
Edm.Decimal | Numeric values with fixed precision and scale | 2.345M | 2.345M |
Edm.Double | IEEE 754 binary64 floating-point number (15-17 decimal digits) | 2.029d | 2.029d |
Edm.Duration | Signed duration in days, hours, minutes, and (sub)seconds | duration’PT0S’ | 20D5H2S |
Edm.Guid | 16-byte (128-bit) unique identifier | guid’dddddddd-dddd-dddd-dddd-dddddddddddd’ | 12345678-aaaa-bbbb-cccc-ddddeeeeffff |
Edm.Int16 | Signed 16-bit integer | 16 | 16 |
Edm.Int32 | Signed 32-bit integer | 32 | 32 |
Edm.Int64 | Signed 64-bit integer | 64L | 64L |
Edm.Single | IEEE 754 binary32 floating-point number (6-9 decimal digits) | 2.0f | 2.0f |
Edm.String | Sequence of UTF-8 characters | ‘russellwhyte’ | russellwhyte |
Edm.TimeOfDay | Clock time 00:00-23:59:59.999999999999 | timeofday’12:30:00.00′ | 12:30:00.00 |
1. Create
To create an entity in a collection, body MUST contain a single valid entity representation.
Properties with Edm type having Collection should have each of its value enclosed within <element> tags.
Request Schema
<EntitySetName>
<EntityTypeName>
<PropertyName>PropertyValue</PropertyName>
<PropertyName>PropertyValue</PropertyName>
<PropertyName> //Property with type Collection of Primitive
<element>PropertyValue</element>
</PropertyName>
<PropertyName> //Property with type Collection of Complex
<element>
<PropertyName>PropertyValue</PropertyName>
<PropertyName>PropertyValue</PropertyName>
</element>
<element>
<PropertyName>PropertyValue</PropertyName>
<PropertyName>PropertyValue</PropertyName>
</element>
</PropertyName>
</EntityTypeName>
</EntitySetName>
Sample payload for Microsoft hosted V4 service https://services.odata.org/TripPinRESTierService/(S(samplePayload))/
<People>
<Person>
<UserName>russellwhyte</UserName>
<FirstName>Russell</FirstName>
<LastName>Whyte</LastName>
<MiddleName />
<Gender>Male</Gender>
<Age />
<Emails>
<element>Russell@example.com</element>
<element>Russell@contoso.com</element>
</Emails>
<FavoriteFeature>Feature1</FavoriteFeature>
<Features>
<element>Feature1</element>
<element>Feature2</element>
</Features>
<AddressInfo>
<element>
<Address>187 Suffolk Ln.</Address>
<City>
<Name>Boise</Name>
<CountryRegion>United States</CountryRegion>
<Region>ID</Region>
</City>
</element>
</AddressInfo>
<HomeAddress />
</Person>
</People>
2. Deep Insert
A request to create an entity that includes related entities, represented using the appropriate inline representation, is referred to as a “deep insert”.
Request Schema for Deep insert
<EntitySetName>
<EntityTypeName>
<PropertyName>PropertyValue</PropertyName>
<PropertyName>PropertyValue</PropertyName>
<PropertyName>
<element>
<PropertyName>PropertyValue</PropertyName>
<PropertyName>PropertyValue</PropertyName>
</element>
</PropertyName>
<NavigationPropertyName> //Navigation Property with type Single Entity
<EntityTypeName>
<PropertyName>PropertyValue</PropertyName>
<PropertyName>
<element>PropertyValue</element>
</PropertyName>
</EntityTypeName>
</NavigationPropertyName>
<NavigationPropertyName> //Navigation Property with type collection of Entity
<EntityTypeName>
<PropertyName>PropertyValue</PropertyName>
<PropertyName>
<element>PropertyValue</element>
</PropertyName>
</EntityTypeName>
<EntityTypeName>
<PropertyName>PropertyValue</PropertyName>
<PropertyName>
<element>PropertyValue</element>
</PropertyName>
</EntityTypeName>
</NavigationPropertyName>
</EntityTypeName>
</EntitySetName>
From the below edmx, The Entity “Person” has navigation to BestFriend with target type as a single Person
Entity “Person” also has navigation to Trips which is a collection of Trip.
<EntityType Name="Person">
<Key>
<PropertyRef Name="UserName"/>
</Key>
<Property Name="UserName" Type="Edm.String" Nullable="false"/>
<Property Name="FirstName" Type="Edm.String" Nullable="false"/>
<Property Name="LastName" Type="Edm.String"/>
<Property Name="MiddleName" Type="Edm.String"/>
<Property Name="Gender" Type="Microsoft.OData.Service.Sample.TrippinInMemory.Models.PersonGender" Nullable="false"/>
<Property Name="Age" Type="Edm.Int64"/>
<Property Name="Emails" Type="Collection(Edm.String)"/>
<Property Name="AddressInfo" Type="Collection(Microsoft.OData.Service.Sample.TrippinInMemory.Models.Location)"/>
<Property Name="HomeAddress" Type="Microsoft.OData.Service.Sample.TrippinInMemory.Models.Location"/>
<Property Name="FavoriteFeature" Type="Microsoft.OData.Service.Sample.TrippinInMemory.Models.Feature" Nullable="false"/>
<Property Name="Features" Type="Collection(Microsoft.OData.Service.Sample.TrippinInMemory.Models.Feature)" Nullable="false"/>
<NavigationProperty Name="Friends" Type="Collection(Microsoft.OData.Service.Sample.TrippinInMemory.Models.Person)"/>
<NavigationProperty Name="BestFriend" Type="Microsoft.OData.Service.Sample.TrippinInMemory.Models.Person"/>
<NavigationProperty Name="Trips" Type="Collection(Microsoft.OData.Service.Sample.TrippinInMemory.Models.Trip)"/>
</EntityType>
2.1 Sample Payload for deep insert with the target type single entity
<People>
<Person>
<UserName>russellwhyte</UserName>
<FirstName>Russell</FirstName>
<LastName>Whyte</LastName>
<Gender>Male</Gender>
<AddressInfo>
<element>
<Address>187SuffolkLn.</Address>
<City>
<Name>Boise</Name>
<CountryRegion>UnitedStates</CountryRegion>
<Region>ID</Region>
</City>
</element>
</AddressInfo>
<BestFriend>
<Person>
<UserName>scottketchum</UserName>
<FirstName>Scott</FirstName>
<LastName>Ketchum</LastName>
<Gender>Male</Gender>
<Emails>
<element>Scott@example.com</element>
</Emails>
<FavoriteFeature>Feature1</FavoriteFeature>
<AddressInfo>
<element>
<Address>2817MiltonDr.</Address>
<City>
<Name>Albuquerque</Name>
<CountryRegion>UnitedStates</CountryRegion>
<Region>NM</Region>
</City>
</element>
</AddressInfo>
</Person>
</BestFriend>
</Person>
</People>
2.2 Sample Payload for deep insert with the target type collection of Entity
<People>
<Person>
<UserName>russellwhyte</UserName>
<FirstName>Russell</FirstName>
<LastName>Whyte</LastName>
<Gender>Male</Gender>
<FavoriteFeature>Feature1</FavoriteFeature>
<Features>
<element>Feature1</element>
<element>Feature2</element>
</Features>
<BestFriend>
<Person>
<UserName>scottketchum</UserName>
<FirstName>Scott</FirstName>
<LastName>Ketchum</LastName>
<Gender>Male</Gender>
<Emails>
<element>Scott@example.com</element>
</Emails>
<FavoriteFeature>Feature1</FavoriteFeature>
<AddressInfo>
<element>
<Address>2817MiltonDr.</Address>
<City>
<Name>Albuquerque</Name>
<CountryRegion>UnitedStates</CountryRegion>
<Region>NM</Region>
</City>
</element>
</AddressInfo>
<HomeAddress/>
<Trips>
<Trip>
<TripId>3</TripId>
<ShareId>9d9b2fa0-efbf-490e-a5e3-bac8f7d47354</ShareId>
<Name>TripinUS</Name>
<Budget>5000</Budget>
<Description>TripfromSanFranciscotoNewYorkCity</Description>
<Tags>
<element>business</element>
<element>NewYorkmeeting</element>
</Tags>
<StartsAt>2014-01-01T00:00:00Z</StartsAt>
<EndsAt>2014-01-04T00:00:00Z</EndsAt>
</Trip>
<Trip>
<TripId>4</TripId>
<ShareId>f94e9116-8bdd-4dac-ab61-08438d0d9a71</ShareId>
<Name>TripinBeijing</Name>
<Budget>11000</Budget>
<Description>Trip from Shanghai to Beijing</Description>
<Tags>
<element>Travel</element>
<element>Beijing</element>
</Tags>
<StartsAt>2014-02-01T00:00:00Z</StartsAt>
<EndsAt>2014-02-04T00:00:00Z</EndsAt>
</Trip>
</Trips>
</Person>
</BestFriend>
</Person>
</People>
2. Update (PATCH)
Updates an existing Single Entry with a valid payload
<People>
<Person>
<UserName>lewisblack</UserName>
<FirstName>Lewis</FirstName>
<Gender>Male</Gender>
<LastName>Black</LastName>
<element>lewisblack@example.com</element>
<element>lewisblack@noone.com</element>
<AddressInfo>
<element>
<Address>187 Suffolk Ln.</Address>
</element>
<element>
<Address>188 Suffolk Ln.</Address>
<City>
<CountryRegion>United States</CountryRegion>
<Name>Boise</Name>
<Region>ID</Region>
</City>
</element>
</AddressInfo>
<FavoriteFeature>Feature1</FavoriteFeature>
</Person>
</People>