2012-07-06 74 views
5

我有一个实体,它具有要保存在Azure表存储中的TimeSpan属性。当我试图挽救实体我得到的错误:Azure Table Storage中的TimeSpan属性存储

Can't cast to unsupported type 'TimeSpan'

有一些方法做一个自动转换或其他方式来支持TimeSpan

回答

3

我将TimeSpan存储为int或bigint字段中的tick并将其转换。你也可以把它作为一个varchar存储。我更喜欢ticks,因为如果需要的话,可以在数据库中对它进行数学运算,并且它使范围比较更容易。如果您使用的是实体框架,则可以声明一个未映射的属性,从您的数据库友好属性中获取并设置TimeSpan。

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

+1

我正在使用Azure表存储(NoSQL存储服务),所以我不认为我可以使用EF。我已经想过将蜱储存很长时间 - 这就是我现在正在做的解决方法,但是想看看是否有更好的方法。 – 2012-07-06 15:56:23

+1

看看http://convective.wordpress.com/2009/12/30/entities-in-azure-tables/。其中的一部分描述了如何从Azure表存储中排除某个属性,这应该使我提出的EF适用于ATS的方法。 – JamieSee 2012-07-06 16:54:34

+0

我们在这里使用蜱虫。确保您将存储到UTC的任何时间标准化,以便应用滴答将为您提供正确的偏移和时间。 – dunnry 2012-07-06 17:28:38

0

因为我遇到了Microsoft客户端的限制,我写了一个备用的Azure表格存储客户端Lucifure Stash,它有很多高级抽象。支持数据列> 64K,列表,数组,枚举,序列化,变体,公共和私有属性以及字段等等。它可以免费供个人使用,可以从http://www.lucifure.com或通过NuGet.com(http://nuget.org/packages/LucifureStash)下载。

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

+0

谢谢@Lucifure,我会看看它是否适合我的需求。 – 2012-07-07 01:33:05

0

由于JamieSee建议您可以将TimeSpan存储为某些long int中的tick,您还可以将该对象序列化为Byte Array。

无论您使用哪种复杂/不支持的类,都可以将其序列化为字节数组并将其上载,然后检索,反序列化并将其转换回原来的类型。当我需要上传KeyValuePairs列表时,我这样做了。

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

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); } 
    } 
} 
0

TimeSpan类型,甚至可空TimeSpan?类型由Azure存储SDK支持> 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

平铺和Convertback方法支持几乎任何类型的属性除了IEnumerable的/ ICollection的类型索引的属性。

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

所有你需要做的就是把你的对象传递给这个适配器,这就是全部。 https://www.nuget.org/packages/TableEntityAdapter/

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