已经有很多关于能够挂接到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