2012-07-06 32 views
5

Tôi có một thực thể có thuộc tính TimeSpan Tôi muốn lưu trong Bộ nhớ bảng Azure. Khi tôi cố gắng để lưu các đơn vị tôi nhận được lỗi:Thuộc tính TimeSpan trong Bộ nhớ bảng Azure

Can't cast to unsupported type 'TimeSpan'

Có một số cách để làm chuyển đổi tự động hoặc một số cách khác để hỗ trợ TimeSpan?

Trả lời

3

Tôi lưu trữ TimeSpan dưới dạng các dấu tích trong trường int hoặc bigint và chuyển đổi. Bạn cũng có thể lưu trữ nó như là một varchar. Tôi thích bọ ve bởi vì bạn có thể làm toán trên nó trong cơ sở dữ liệu nếu bạn cần và nó làm cho việc so sánh phạm vi dễ dàng hơn. Nếu bạn đang sử dụng Entity Framework, bạn có thể khai báo một thuộc tính chưa được ánh xạ nhận và thiết lập một TimeSpan từ thuộc tính thân thiện với cơ sở dữ liệu của bạn.

Hãy xem Entities in Azure Tables. Một phần của nó mô tả làm thế nào để loại trừ một tài sản từ Azure Table Storage, mà nên làm cho những gì tôi đề xuất với EF hoàn toàn khả thi cho ATS.

+1

Tôi đang sử dụng Azure Table Storage (dịch vụ lưu trữ NoSQL), vì vậy tôi không nghĩ mình có thể sử dụng EF với điều đó. Tôi đã nghĩ đến việc lưu trữ ve trong một thời gian dài - đó là những gì tôi đang làm như một công việc xung quanh vào lúc này nhưng muốn xem có cách nào tốt hơn không. –

+1

Hãy xem http://convective.wordpress.com/2009/12/30/entities-in-azure-tables/. Một phần của nó mô tả làm thế nào để loại trừ một tài sản từ Azure Table Storage, mà nên làm cho những gì tôi đề xuất với EF hoàn toàn khả thi cho ATS. – JamieSee

+0

Chúng tôi sử dụng bọ ve ở đây. Hãy chắc chắn rằng bạn chuẩn hóa bất kỳ thời gian nào được lưu trữ cho UTC để áp dụng các dấu tick sẽ giúp bạn có được thời gian bù và thời gian phù hợp. – dunnry

0

Vì tôi gặp phải những hạn chế trên máy khách Microsoft, tôi đã viết một ứng dụng lưu trữ bảng Azure thay thế, Lucifure Stash, với nhiều trừu tượng mức cao.

Lucifure Stash, hỗ trợ cột dữ liệu> 64K, danh sách, mảng, liệt kê, tuần tự hóa, biến đổi, thuộc tính công khai và riêng và các trường và hơn thế nữa. Nó là miễn phí cho sử dụng cá nhân và có thể được tải về từ http://www.lucifure.com hoặc thông qua NuGet.com (http://nuget.org/packages/LucifureStash).

Bạn có thể dễ dàng sử dụng nó để biến một TimeSpan thành kiểu dữ liệu được Azure Storage Tables hỗ trợ.

+0

Cảm ơn @Lucifure, tôi sẽ xem xét nó để xem liệu nó có phù hợp với nhu cầu của tôi không. –

0

Khi JamieSee đề xuất bạn có thể lưu trữ TimeSpan dưới dạng các dấu tích trong một khoảng thời gian dài, những gì bạn cũng có thể làm là tuần tự hóa đối tượng thành một Byte Array.

Không có vấn đề gì phức tạp/không được hỗ trợ lớp bạn có bạn luôn có thể serialize nó vào một Byte Array và tải nó lên, sau đó lấy, deserialize nó và đúc nó trở lại bất cứ loại nó được. Tôi đã làm điều này khi tôi cần tải lên Danh sách các KeyValuePairs.

Bạn có thể tạo chuyển đổi tự động trong trình khởi động thuộc tính và thiết lập.

0

Để lưu trữ một TimeSpan thành một CloudTable, Tôi đang sử dụng một tài sản mà không được dịch với TimeSpan tài sản long:

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 loại và thậm chí nullable TimeSpan? loại được hỗ trợ bởi Azure lưu trữ SDK > v8.0.0.

Flatten thực thể của bạn bằng cách sử dụng phương pháp tĩnh phương pháp helper TableEntity.Flatten và ghi vào bộ nhớ bảng:

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

Khi bạn đọc những thực thể trở lại từ bảng, chuyển đổi nó trở lại thực thể ban đầu của bạn sử dụng phương pháp TableEntity.Convertback.

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

Flatten và Convertback phương pháp hỗ trợ khá nhiều bất kỳ loại tài sản trừ/loại ICollection lập chỉ mục thuộc tính IEnumerable.

Tôi đã viết một lớp TableEntityAdapter bên dưới các phương thức TableEntity.FlattenConvertBack và giúp các nhà phát triển dễ sử dụng.

Tất cả những gì bạn cần làm là chuyển đối tượng của bạn đến bộ điều hợp này và tất cả chỉ có thế. https://www.nuget.org/packages/TableEntityAdapter/

Nếu bạn muốn tìm hiểu thêm một chút về cách các phương pháp Flatten và ConvertBack hoạt động phía sau nắp, hãy xem bài viết tôi đã viết. https://www.nuget.org/packages/ObjectFlattenerRecomposer/

Các vấn đề liên quan