Azure表存储中的TimeSpan属性

时间:2012-07-06 15:41:36

标签: .net azure azure-table-storage

我有一个具有TimeSpan属性的实体,我希望在Azure表存储中保存。当我尝试保存实体时,我收到错误:

  

无法转换为不支持的类型'TimeSpan'

是否有某种方法可以进行自动转换或其他方式来支持TimeSpan

5 个答案:

答案 0 :(得分:4)

我将TimeSpan存储为int或bigint字段中的刻度并转换它。您也可以将其存储为varchar。我更喜欢刻度,因为如果需要,你可以在数据库中对它进行数学计算,这样可以更容易地进行范围比较。如果您正在使用Entity Framework,则可以声明一个未映射的属性,该属性从您的数据库友好属性中获取并设置TimeSpan。

看看Entities in Azure Tables。其中一部分描述了如何从Azure表存储中排除属性,这应该使我建议的EF也适用于ATS。

答案 1 :(得分:0)

由于我在Microsoft客户端遇到了限制,因此我编写了一个备用Azure表存储客户端Lucifure Stash,其中包含许多高级抽象。

Lucifure Stash,支持数据列> 64K,列表,数组,枚举,序列化,变形,公共和私有属性和字段等。它是免费供个人使用,可以从http://www.lucifure.com或通过NuGet.com(http://nuget.org/packages/LucifureStash)下载。

您可以轻松地使用它将TimeSpan变形为Azure存储表支持的数据类型。

答案 2 :(得分:0)

正如JamieSee建议您可以将TimeSpan存储为某些long int中的刻度,您还可以将对象序列化为字节数组。

无论您拥有什么复杂/不受支持的类,您都可以将其序列化为字节数组并上传,然后检索,反序列化并将其转换回任何类型。当我需要上传KeyValuePairs列表时,我这样做了。

您可以在属性getter和setter中创建自动转换。

答案 3 :(得分:0)

为了将TimeSpan存储到CloudTable中,我使用了使用long属性进行翻译的TimeSpan属性:

public class MyEntity : Microsoft.WindowsAzure.Storage.Table.TableEntity
{
    public TimeSpan MyDuration { get; set; }

    // Workaround the fact that TableEntity does not automatically store a `TimeSpan` 
    public long MyDurationTicks
    {
        get { return MyDuration.Ticks; }
        set { MyDuration = TimeSpan.FromTicks(value); }
    }
}

答案 4 :(得分:0)

Azure Storage SDK>支持

TimeSpan类型甚至可为空的TimeSpan?类型。 V8.0.0。

使用静态帮助器方法TableEntity.Flatten方法展平您的实体并写入表存储:

https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.table.tableentity.flatten.aspx

当您从表中读回实体时,使用TableEntity.Convertback方法将其转换回原始实体。

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

Flatten和Convertback方法几乎支持除IEnumerable / ICollection类型索引属性之外的任何类型的属性。

我编写了一个TableEntityAdapter类,它在调用TableEntity.FlattenConvertBack方法下面,使开发人员可以轻松使用。

您需要做的就是将您的对象传递给此适配器以及所有这些。 https://www.nuget.org/packages/TableEntityAdapter/

如果您想了解Flatten和ConvertBack方法如何在封面后工作,请查看我写的文章。 https://www.nuget.org/packages/ObjectFlattenerRecomposer/