6

我有一个TimeSpan要保存在 Azure 表存储中的属性的实体。当我尝试保存实体时,出现错误:

无法转换为不受支持的类型“TimeSpan”

有没有办法进行自动转换或其他方式来支持TimeSpan

4

5 回答 5

4

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

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

于 2012-07-06T15:48:35.323 回答
1

TimeSpanTimeSpan?Azure Storage 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

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

我编写了一个 TableEntityAdapter 类,它位于调用TableEntity.FlattenConvertBack方法的下方,便于开发人员使用。

您需要做的就是将您的对象传递给这个适配器,仅此而已。 https://www.nuget.org/packages/TableEntityAdapter/

如果您想进一步了解 Flatten 和 ConvertBack 方法是如何在幕后工作的,请查看我写的文章。 https://www.nuget.org/packages/ObjectFlatenerRecomposer/

于 2017-04-08T21:10:45.777 回答
0

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

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

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

于 2012-07-07T13:19:09.963 回答
0

因为我在 Microsoft 客户端上遇到了限制,所以我编写了一个备用 Azure 表存储客户端 Lucifure Stash,它具有许多高级抽象。

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

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

于 2012-07-06T16:15:47.317 回答
0

为了将 a 存储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); }
    }
}
于 2017-03-29T14:23:57.550 回答