2011-05-29 56 views
3

已經有很多關於能夠掛接到WritingEntity事件來定製提交給服務器的XML的博客文章,例如thisAzure表存儲 - 用於保存集合的自定義表實體保存

此更新版本的SDK中的此過程有任何更改嗎?我問,因爲我有以下簡單的實體:

public class Label : TableServiceEntity 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public string Notes { get; set; } 
    public string ContactInfo { get; set; } 
    public List<string> Urls { get; set; } 

    public Label() 
    { 
     Urls = new List<string>(): 
    } 
} 

我希望能夠堅持URL的該集合,我已經知道,多數民​​衆贊成直接支持的陣列而言唯一/集是二進制陣列。所以我認爲,很好,我只需勾選該WritingEntity事件並將該列表序列化爲JSON/XML,然後按照該博客文章將其添加到屬性列表中。然後在處理ReadEntity事件期間反序列化回列表。

但是,當我這樣做時,在調用TableServiceContext上的SaveChanges時,我得到一個DataServiceRequest異常,其中包含一個內部NotSupported異常,並顯示消息「僅支持實體集合」。這是因爲String類不是從TableEntity繼承的?讓我感到困惑的是,當我檢查寫出的XML時,它實際上已經能夠成功地編寫包含序列化列表的附加屬性的自定義XML,儘管例外。

當我嘗試通過CreateQuery檢索標籤時,我得到相同的異常拋出。

有人可以告訴我我在做什麼錯在這裏,以及處理這種情況的最佳做法是什麼?我已經遇到了Lokad Cloud做的持久性,但它對我來說似乎並不理想,因爲用於獲取數據的查詢選項對於我想要做的事情來說太有限了。

我確實看過去的問題,但似乎沒有直接解決這個問題。

任何意見將不勝感激!

基於響應: 我不知道您是否感覺我手動序列化整個實體?分區鍵只是「LABELX」,其中X是標籤的Name屬性的第一個字母,行鍵只是GUID的字符串表示(我知道存儲這兩個都是浪費的,但我是隻是想在此刻起牀並跑步)。

如果您在WritingEntity事件的第一行設置了斷點,並且您檢查了e.Data屬性中的XML,則沒有任何內容可以表示XML中的URL集合。無論URL列表是空的還是空的,或者它包含條目都沒有關係 - 它完全不出現在XML中,所以我傳入的列表並不重要。所以我認爲應該回答全部4個問題。

在寫入實體事件中,實際上並沒有什麼特別之處:只需將代碼序列化爲XML,然後按照博客文章向XML中添加屬性的代碼 - 它們都運行時沒有任何異常。


好的,對不起,我忽略了提及那個事實,即我現在只使用開發存儲。這個問題似乎是因爲我創建了一些沒有任何URL的Label實體,之後我創建了這些實體,因此TableContainer表中的模式信息沒有附加的URL屬性。在清理完數據庫並在之前添加了一個完全填充的對象之後,一切正常!

回答

2

我有一些代碼,這方面的工作 - 它肯定似乎與1.4 SDK工作

我的代碼更多的是基於通用的實體和我用的靈感來源是:

我是猜測您的WritingEntity事件處理程序中出現錯誤。你可以張貼更多的代碼 - 特別是:

  • 你是如何序列化RowKey和PartitionKey的?
  • 你是否從序列化中刪除原始Url列表?
  • 如果您將XML用於內部序列化,那麼您是否完全逃避該XML?

一個進一步的調試想法是隻是儘量讓代碼工作一步一步 - 即

  1. 開始與沒有列表中的實體,
  2. 然後嘗試將使用另一種簡單的測試性能WritingEntity掛鉤,
  3. 然後嘗試添加Url列表,並在WritingEntity期間刪除它。
  4. 然後嘗試序列化並在寫入實體中添加此新屬性
+0

+1對於一個很好的答案。 – 2012-07-25 23:16:11

+0

爲了覆蓋2.0 SDK中的實體編寫,這裏有一個答案http://stackoverflow.com/a/15179860/828957 – Rob 2013-03-02 21:55:13