持久保存到Azure表存储时使用POCO

时间:2015-11-25 09:00:59

标签: c# asp.net azure asp.net-core azure-table-storage

我计划在我的ASP.NET 5(MVC 6)应用程序中使用Azure表存储并添加了WindowsAzure.Storage NuGet包,但当我注意到所有我的模型时,我真的很失望需要继承Microsoft.WindowsAzure.Storage.Table.TableEntity。现在,我认为最好的解决方案是拥有两组实体,并在我的主域对象和用于持久存储到表存储的实体对象之间创建映射。我不想将WindowsAzure.Storage包添加到我的所有项目中。

弃用的azure-sdk-for-net一度获得了对POCO的支持,但我在当前的WindowsAzure.Storage中看不到这一点。

这里的最佳做法是什么?

3 个答案:

答案 0 :(得分:6)

您没有详细说明尝试写入Azure表存储的实体类型,但是如果您的实体包含嵌套的复杂属性,并且您要编写包含复杂嵌套属性的整个对象图(它们本身可能包含这些属性)嵌套属性),这些建议的解决方案都不起作用。

我遇到了类似的问题并实现了一个通用对象flattener / recomposer API,它将复杂的实体展平为扁平WHERE Instr( 1, ',' & [Enter list:] & ',', ',' & var & ',' ) > 0 词典,并以{{1}的形式将它们写入表存储}。

然后,相同的API将从EntityProperty的{​​{1}}字典重新组合整个复杂对象。

查看:https://www.nuget.org/packages/ObjectFlattenerRecomposer/

我正在与Azure团队合作,将此API集成到Azure Storage SDK中。您可以在这里查看pull请求和代码:

https://github.com/Azure/azure-storage-net/pull/337/commits

<强>用法:

DynamicTableEntity

这就是全部:)

对此的更新,我已将ObjectFlattenerRecomposer API集成到Azure Storage SDK 8.0.0版本中

Flatten和ConvertBack方法通过SDK的TableEntity类作为静态方法公开提供。请参阅下面的msdn文档:

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

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

因此,如果您获得Azure Storage .Net SDK 8.0.0或更高版本,则可以直接使用存储SDK中的方法。

答案 1 :(得分:1)

您可以远离继承TableEntity,但为此您最终会编写一些映射代码。在实际与Table Storage交互的代码中,您可以使用TcpClient client = listener.AcceptTcpClient(); 从更多原始表数据到对象进行一些映射,以完全控制序列化。

有几篇文章可以帮助你:

如果查看第二篇文章,它会显示在Azure表存储中保存和更新的特定POCO对象的代码。第三篇文章扩展了第一篇文章,包括ETag支持。

答案 2 :(得分:0)

我制作了可以做到这一点的库

TableStorage.Abstractions.TableEntityConverters将POCO转换为DynamicTableEntity,反之亦然。它具有让您指定分区键,行键和忽略字段的功能。

TableStorage.Abstractions.POCO以此为基础,并建立了一个表存储库库(TableStorage.Abstractions)。结合起来,它为您提供了一种使用POCO在表存储上进行CRUD的简便方法。