2012-07-06 13 views
5

Ho un'entità con una proprietà TimeSpan che voglio salvare in Archiviazione tabella di Azure. Quando si tenta di salvare l'entità ottengo l'errore:Proprietà TimeSpan in Archiviazione tabelle di Azure

Can't cast to unsupported type 'TimeSpan'

C'è qualche modo per fare una conversione automatica o qualche altro modo per sostenere TimeSpan?

risposta

3

Memorizzo TimeSpan come tick in un campo int o bigint e lo converto. Potresti anche memorizzarlo come un varchar. Preferisco le zecche perché puoi fare matematica su di essa nel database se ne hai bisogno e rende più facile il confronto di intervalli. Se si utilizza Entity Framework, è possibile dichiarare una proprietà non mappata che ottiene e imposta un TimeSpan dalla proprietà del database.

Dai un'occhiata allo Entities in Azure Tables. Una parte di essa descrive come escludere una proprietà da Azure Table Storage, che dovrebbe rendere anche realizzabile ciò che ho proposto con EF per ATS.

+1

Sto utilizzando Azure Table Storage (servizio di archiviazione NoSQL), quindi non credo di poter utilizzare EF con quello. Ho già pensato di immagazzinare le zecche per un lungo periodo - questo è quello che sto facendo come un work-around al momento, ma volevo vedere se c'è un modo migliore. –

+1

Dai un'occhiata a http://convective.wordpress.com/2009/12/30/entities-in-azure-tables/. Una parte di essa descrive come escludere una proprietà da Azure Table Storage, che dovrebbe rendere anche realizzabile ciò che ho proposto con EF per ATS. – JamieSee

+0

Utilizziamo le zecche qui. Assicurati di standardizzare tutte le volte memorizzate in UTC in modo tale che applicando i tick otterrai il giusto offset e tempo. – dunnry

0

Poiché ho incontrato limitazioni sul client Microsoft, ho scritto un client di archiviazione tabella Azure alternativo, Lucifure Stash, con molte astrazioni di alto livello.

Lucifure Stash, supporta colonne di dati> 64 KB, elenchi, array, enumerazioni, serializzazione, morphing, proprietà e campi pubblici e privati ​​e altro ancora. È gratuito per uso personale e può essere scaricato da http://www.lucifure.com o tramite NuGet.com (http://nuget.org/packages/LucifureStash).

È possibile utilizzarlo facilmente per trasformare un TimeSpan in un tipo di dati supportato dalle tabelle di archiviazione di Azure.

+0

Grazie a @Lucifure, darò un'occhiata per vedere se soddisfa le mie esigenze. –

0

Come JamieSee ha suggerito di poter memorizzare TimeSpan come tick in alcuni long int, ciò che si può anche fare è serializzare l'oggetto in un Byte Array.

Indipendentemente dalla classe complessa/non supportata, è sempre possibile serializzarlo su un array di byte e caricarlo, quindi recuperarlo, deserializzarlo e restituirlo a qualsiasi tipo fosse. L'ho fatto quando ho avuto bisogno di caricare un elenco di KeyValuePairs.

È possibile creare conversioni automatiche nelle proprietà getter e setter.

0

Al fine di memorizzare un TimeSpan in un CloudTable, sto usando una proprietà long che fa la traduzione con l'TimeSpan proprietà:

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 persino nullable TimeSpan? tipo è supportato da Azure SDK > v8.0.0.

appiattire l'entità utilizzando il metodo metodo di supporto TableEntity.Flatten statica e scrivere stoccaggio tavolo:

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

Quando si legge l'entità di ritorno da tavolo, riconvertirlo al vostro soggetto originale utilizzando TableEntity.Convertback metodo.

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

appiattire e Convertback metodi supportano praticamente qualsiasi tipo di immobile, tranne IEnumerable/tipo ICollection indicizzati proprietà.

Ho scritto una classe TableEntityAdapter al di sotto delle chiamate TableEntity.Flatten e ConvertBack e facilita l'utilizzo da parte degli sviluppatori.

Tutto quello che devi fare è passare l'oggetto a questo adattatore e basta. https://www.nuget.org/packages/TableEntityAdapter/

Se vuoi saperne di più su come i metodi Flatten e ConvertBack funzionano dietro le copertine, dai un'occhiata all'articolo che ho scritto. https://www.nuget.org/packages/ObjectFlattenerRecomposer/

Problemi correlati