Azure表存储-为持久化集合自定义表实体保存



已经有很多关于能够挂钩到WritingEntity事件来定制提交到服务器的XML的博客文章,比如这样。

在更新版本的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实体之前,我创建了一些没有URL的Label实体,因此TableContainer表中的架构信息没有额外的URL属性。在我清理了数据库并添加了一个完全填充的对象之后,添加了其他内容,一切都正常!

我有一些代码在处理这个问题,它似乎可以与1.4 SDK 一起使用

我的代码更多地基于通用实体,我用来获得灵感的来源是:

  • Jai在上的帖子http://social.msdn.microsoft.com/Forums/en-US/windowsazure/thread/481afa1b-03a9-42d9-ae79-9d5dc33b9297/
  • 从《易论罗》http://social.msdn.microsoft.com/Forums/en-US/windowsazure/thread/f57cb566-cc7a-4b31-b1ab-47b6d16604af/
  • 还有一个很好的学分,因为来自http://azuretablequery.codeplex.com/

我猜您的WritingEntity事件处理程序有问题。你能发布更多的代码吗?尤其是:

  • 您是如何序列化RowKey和PartitionKey的
  • 你是不是从连载中删除了原始的Urls列表
  • 如果您使用XML进行内部序列化,那么您是否完全转义了该XML

一个进一步的调试想法是尝试让代码一步一步地工作,即

  1. 从没有列表的实体开始
  2. 然后尝试使用WritingEntity钩子添加另一个简单的测试属性
  3. 然后尝试添加一个Urls列表,并在WritingEntity期间将其删除
  4. 然后尝试序列化并在WritingEntity中添加此新属性

相关内容

  • 没有找到相关文章

最新更新