【问题标题】:Azure Table Storage - Customising table entity saves for persisting collectionsAzure 表存储 - 自定义表实体保存以保存集合
【发布时间】:2011-10-20 01:36:22
【问题描述】:

已经有很多关于能够挂钩到 WritingEntity 事件以自定义提交到服务器的 XML 的博客文章,例如 this

在较新版本的 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 列表是空的、null 还是其中有条目都没有关系 - 它根本不会出现在 XML 中,所以我传入的列表无关紧要。所以我认为应该回答全部 4 个问题。

在写入实体事件中,实际上并没有什么特别之处:只是将列表序列化为 XML 的代码,然后根据博客文章向 XML 添加属性的代码 - 所有这些都运行没有任何异常。


好的,抱歉,我忽略了我目前只使用开发存储这一事实。问题似乎在于,我创建了一些没有任何 URL 的 Label 实体,然后才创建了具有 URL 的实体,因此 TableContainer 表中的架构信息没有额外的 URL 属性。在我清理了数据库并添加了一个完全填充的对象之后添加任何其他内容之前,一切正常!

【问题讨论】:

    标签: azure azure-table-storage


    【解决方案1】:

    我已经编写了一些代码来解决这个问题 - 它似乎确实适用于 1.4 SDK

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

    猜测您的 WritingEntity 事件处理程序有问题。您能否发布更多代码 - 特别是:

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

    另一个调试想法是尝试逐步让代码工作 - 即

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

    【讨论】:

    猜你喜欢
    • 2015-07-29
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2017-10-18
    • 2010-11-26
    • 2019-11-17
    相关资源
    最近更新 更多