已經有很多關於能夠掛接到WritingEntity事件來定製提交給服務器的XML的博客文章,例如this。Azure表存儲 - 用於保存集合的自定義表實體保存
此更新版本的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屬性。在清理完數據庫並在之前添加了一個完全填充的對象之後,一切正常!
+1對於一個很好的答案。 – 2012-07-25 23:16:11
爲了覆蓋2.0 SDK中的實體編寫,這裏有一個答案http://stackoverflow.com/a/15179860/828957 – Rob 2013-03-02 21:55:13