2013-03-28 30 views
5

是否有可能为Azure表存储创建非派生POCO?非派生POCO和Azure存储

换句话说,POCO不是从TableEntity派生的,或者是执行ITableEntity

看起来倒退了一步,必须有一个依赖于接口或基类的模型,因为这会导致链中的引用泄漏 - 我不能在另一个层中设置模型,而不必知道它适用于接口或基类的Azure存储!

回答

7

看看DynamicTableEntity(ctrl + f)。它可以用来查询和插入实体。

使用此类型,您不会在您的域模型中引入任何依赖项,但是您必须自行将POCO转换为DynamicTableEntity - 如果您愿意标记POCO,则此过程可以轻松实现自动化用一个自定义接口并编写一个映射器(基本上你只需要一个属性字典+需要知道哪些是Partition/RowKey)。

您不能仅将任何实体保存在Azure表存储中的原因是,它需要知道哪个属性充当分区键并以行键的形式存在。必须在“较低级别”上使用DynamicTableEntity的好处是,您可以创建仅返回一部分属性的查询,从而减少资源消耗。这可能会或可能不会有利于您的情况。

-1

首先,有另一种替代TableEntity和ITableEntity,这是使用DataServiceKey属性来装饰你的类,如下面的例子:

[DataServiceKey("PartitionKey", "RowKey")] 
public class MyEntity 
{ 
    public string PartitionKey {get; set;} 
    public string RowKey {get; set;} 
    public DateTime Timestamp {get; set;} 
    //other properties 
} 

然而,这并不能真正解决您的问题不想将Azure实现泄漏到您的模型类中。在这种情况下,我想你可能想看看使用像LOKAD Fat Entities这样的包装器实现。 Lokad将把你的模型对象的序列化/反序列化处理成一个封装器,而这个封装器又存储在表存储器中。然而,Lokad的一个缺点是你的物体在储存中变得不透明,你不能用类似Azure Storage Explorer的东西浏览它们。

+0

这在当前版本的SDK中不起作用。 – James

0

看一看我实现了包装,放入的NuGet: https://www.nuget.org/packages/ObjectFlattenerRecomposer/

它也被加入到Azure存储SDK下一个版本: https://github.com/Azure/azure-storage-net/pull/337/files

说明:

提供的功能,将复杂对象平铺到EntityProperty字典和功能中,以重构扁平属性字典中的原始复杂对象。一种用法是API允许将任何具有嵌套属性的复杂对象以扁平形式写入Azure表存储,这通常不能通过使用Azure Storage Client SDK来实现。

版本2.0现在还支持写入和读取IEnumerable类型属性,如列表,数组,字典到Azure表存储。

博客:https://doguarslan.wordpress.com/2016/02/03/writing-complex-objects-to-azure-table-storage/

用法: //拼合对象,并将其转换为EntityProperty字典

字典flattenedProperties = ObjectFlattenerRecomposer.Flatten(complexObject);

//创建一个DynamicTableEntity并设置其PK和RK DynamicTableEntity dynamicTableEntity = new DynamicTableEntity(partitionKey,rowKey);

dynamicTableEntity.Properties = flattenedProperties;

//使用客户SDK写DynammicTableEntity天青表存储

//读为DynamicTableEntity使用[使用PK和RK阅读来自天青]相同PK和RK DynamicTableEntity实体=实体从AzureTableStorage回;

//将DynamicTableEntity转换回原来的复杂对象。 想象一下原来的complexObject是Order类型的。

Order order = ObjectFlattenerRecomposer.ConvertBack(entity.Properties);

+0

我想使用这个,但NuGet包不会安装.NET 4.5目标项目......你可以改变软件包的要求吗?或者这是一个硬性要求? – ramseyjacob

+1

对于迟到的回复感到抱歉。我用.NET 4.5重建了这个包,并且还增加了对Nullable,TimeSpan,DateTimeOffset和Enum属性的读写支持。该软件包位于Nuget中:https://www.nuget.org/packages/ObjectFlattenerRecomposer/1.1.1 –