2012-07-06 31 views
5

Tengo una entidad con una propiedad TimeSpan que deseo guardar en Azure Table Storage. Cuando intento para salvar la entidad consigo el error:Propiedad TimeSpan en Azure Table Storage

Can't cast to unsupported type 'TimeSpan'

¿Hay alguna manera de hacer una conversión automática o alguna otra forma de apoyar TimeSpan?

Respuesta

3

Guardo el TimeSpan como marcas en un campo int o bigint y lo convierto. También podría almacenarlo como varchar. Prefiero los tics porque puede hacer cálculos en la base de datos si es necesario y facilita las comparaciones de rango. Si está utilizando Entity Framework, puede declarar una propiedad no asignada que obtiene y establece un TimeSpan de su propiedad de base de datos.

Eche un vistazo a Entities in Azure Tables. Parte de esto describe cómo excluir una propiedad de Azure Table Storage, lo que también debe hacer que lo que propuse con EF sea factible para ATS.

+1

Estoy usando Azure Table Storage (servicio de almacenamiento NoSQL), así que no creo que pueda usar EF con eso. Ya he pensado en guardar las garrapatas por mucho tiempo; eso es lo que estoy haciendo como solución alternativa en este momento, pero quería ver si había una mejor manera. –

+1

Eche un vistazo a http://convective.wordpress.com/2009/12/30/entities-in-azure-tables/. Parte de esto describe cómo excluir una propiedad de Azure Table Storage, lo que también debe hacer que lo que propuse con EF sea factible para ATS. – JamieSee

+0

Usamos ticks aquí. Asegúrese de estandarizar las veces almacenadas en UTC para que la aplicación de las marcas le proporcione el desplazamiento y la hora correctos. – dunnry

0

Debido a que encontré limitaciones en el cliente de Microsoft, he escrito un cliente alternativo de almacenamiento de tablas Azure, Lucifure Stash, con muchas abstracciones de alto nivel.

Lucifure Stash, admite columnas de datos> 64 K, listas, matrices, enumeraciones, serialización, morphing, propiedades y campos públicos y privados, y más. Es gratis para uso personal y puede descargarse desde http://www.lucifure.com o vía NuGet.com (http://nuget.org/packages/LucifureStash).

Puede usarlo fácilmente para transformar un TimeSpan en un tipo de datos admitido por Azure Storage Tables.

+0

Gracias @Lucifure, lo echaré un vistazo para ver si se ajusta a mis necesidades. –

0

Como JamieSee sugirió que puede almacenar TimeSpan como ticks en algún int largo, lo que también puede hacer es serializar el objeto a una matriz de bytes.

Independientemente de la clase compleja/no compatible que tengas, siempre puedes serializarla en una matriz de bytes y subirla, luego recuperarla, deserializarla y devolverla al tipo que fuera. Hice esto cuando necesitaba subir una lista de KeyValuePairs.

Puede crear conversiones automáticas en las propiedades getter y setter.

0

Con el fin de almacenar un TimeSpan en un CloudTable, estoy usando una propiedad long que hace la traducción con el TimeSpan propiedad:

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 tipo e incluso anulable TimeSpan? tipo con el apoyo de Azure SDK de almacenamiento > v8.0.0.

aplanar su entidad que utiliza el método estático método de ayuda TableEntity.Flatten y escribir en el almacenamiento de tablas:

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

Cuando se lee la entidad de vuelta de mesa, convertir de nuevo a su entidad original usando TableEntity.Convertback método.

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

métodos se aplanan y ConvertBack soportan casi cualquier tipo de bienes, excepto propiedades/tipo ICollection indexados IEnumerable.

He escrito una clase TableEntityAdapter que, por debajo de las llamadas, llama a los métodos TableEntity.Flatten y ConvertBack y hace que sea fácil de usar para los desarrolladores.

Todo lo que necesita hacer es pasar su objeto a este adaptador y eso es todo. https://www.nuget.org/packages/TableEntityAdapter/

Si quiere aprender un poco más sobre cómo funcionan los métodos Flatten y ConvertBack detrás de las coberturas, eche un vistazo al artículo que escribí. https://www.nuget.org/packages/ObjectFlattenerRecomposer/

Cuestiones relacionadas