2011-05-29 41 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