Using POCOs when persisting to Azure Table Storage

扶醉桌前 提交于 2019-12-20 21:21:24

问题


I'm planning to use Azure Table Storage in my ASP.NET 5 (MVC 6) app and have added the WindowsAzure.Storage NuGet package, but I got really disappointed when I noticed that all my entnty models need to inherit from Microsoft.WindowsAzure.Storage.Table.TableEntity. Now I'm thinking the best solution is to have 2 sets of entities and create mappings between my main domain objects and the entity objects used to persist to Table Storage. I don't want to add the WindowsAzure.Storage package to all my projects.

The deprecated azure-sdk-for-net got support for POCOs at one point, but I don't see this in the current WindowsAzure.Storage.

What's the best practice here?


回答1:


You can get away from inheriting from TableEntity, but to do so you end up writing some mapping code. In your code that actually will interact with Table Storage you can do some mapping from more raw table data to your object using the DynamicTableEntity to control serialization completely.

There are a couple of articles that may help you out:

  • Azure EntityAdapter with unsupported table types
  • Using the EntityAdapter for Azure Table Storage
  • Using DTOs/POCOs in Azure Table Storage with a EntityAdapter

If you look at the second article it shows what the code looks like for a specific POCO object being saved and updated in Azure Table Storage. The third article expands upon the work of the first to include ETag Support.




回答2:


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 :)

An update to this, I have integrated the ObjectFlattenerRecomposer API into Azure Storage SDK version 8.0.0

The Flatten and ConvertBack methods are publicly available as static methods through the TableEntity class of the SDK. See msdn documentation below:

https://msdn.microsoft.com/en-us/library/azure/mt775434.aspx

https://msdn.microsoft.com/en-us/library/azure/mt775432.aspx

So if you get the Azure Storage .Net SDK version 8.0.0 or higher you can directly use the methods from the storage SDK.




回答3:


I made libraries that do just this:

TableStorage.Abstractions.TableEntityConverters convert POCOs to DynamicTableEntity and vice versa. It's got functionality that let's you specify the partition key, row key, and ignored fields.

TableStorage.Abstractions.POCO builds on top of this and a Table Storage repository library (TableStorage.Abstractions). Combined, it gives you a pretty easy way to CRUD on Table Storage using POCOs.



来源:https://stackoverflow.com/questions/33912186/using-pocos-when-persisting-to-azure-table-storage

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!