You have not given much detail about the type of entities you try to write to Azure Table Storage however if your entities contain nested complex properties and if you want to write the entire object graph including the complex nested properties (which themselves may contain nested properties), none of these suggested solutions work.
I have come across a similar problem and have implemented a generic object flattener/recomposer API that will flatten your complex entities into flat EntityProperty
dictionaries and make them writeable to Table Storage, in the form of DynamicTableEntity
.
Same API will then recompose the entire complex object back from the EntityProperty
dictionary of the DynamicTableEntity
.
Have a look at: https://www.nuget.org/packages/ObjectFlattenerRecomposer/
I am working with Azure team to integrate this API into Azure Storage SDK. You can have a look at the pull request and the code here:
https://github.com/Azure/azure-storage-net/pull/337/commits
Usage:
//Flatten object of type Order) and convert it to EntityProperty Dictionary
Dictionary<string, EntityProperty> flattenedProperties = EntityPropertyConverter.Flatten(order);
// Create a DynamicTableEntity and set its PK and RK
DynamicTableEntity dynamicTableEntity = new DynamicTableEntity(partitionKey, rowKey);
dynamicTableEntity.Properties = flattenedProperties;
// Write the DynamicTableEntity to Azure Table Storage using client SDK
//Read the entity back from AzureTableStorage as DynamicTableEntity using the same PK and RK
DynamicTableEntity entity = [Read from Azure using the PK and RK];
//Convert the DynamicTableEntity back to original complex object.
Order order = EntityPropertyConverter.ConvertBack<Order>(entity.Properties);
That's all :)
Latest version of the nuget package also supports IEnumerable, ICollection etc. type properties as well.
The .Net Core version of the package is here:
https://www.nuget.org/packages/ObjectFlattenerRecomposer.Core/
CosmosDb Table api version of the package is here:
https://www.nuget.org/packages/ObjectFlattenerRecomposer.CosmosDb.Table.Core/