【问题标题】:Azure Table Storage rejects an entity with a Property whose value is an InterfaceAzure 表存储拒绝具有值为接口的属性的实体
【发布时间】:2012-10-09 23:35:29
【问题描述】:

我有一个名为“评论”的类型,我将其保存到 Azure 表存储。由于评论可以是任意数量的其他类型,因此我创建了一个所有这些类型都实现的接口,然后将 ICommentable 类型的属性放在评论上。所以 Comment 有一个名为 About 的 ICommentable 类型的属性。

当我尝试将评论保存到 Azure 表存储时,如果 Comment.About 属性具有值,我会收到无价值的无效输入错误。但是,如果 Comment.About 没有值,我没有问题。为什么会这样?

Comment.About 不是唯一作为引用类型的属性。例如,Comment.From 是引用类型,但 Comment.About 是接口类型的唯一属性。

失败:

var comment = new Comment();
        comment.CommentText = "It fails!";
        comment.PartitionKey = "TEST";
        comment.RowKey = "TEST123";
        comment.About = sow1;
        comment.From = person1;

作品:

var comment = new Comment();
        comment.CommentText = "It works!";
        comment.PartitionKey = "TEST";
        comment.RowKey = "TEST123";
        //comment.About = sow1;
        comment.From = person1;

谢谢!

【问题讨论】:

    标签: azure azure-storage azure-table-storage


    【解决方案1】:

    Windows Azure 表存储只能存储少数类型,其中没有一个是您创建的 ICommentable 类型:http://msdn.microsoft.com/en-us/library/windowsazure/dd179338.aspx

    【讨论】:

    • 感谢 smarx - 这是有道理的,我实际上知道这一点。令我感到困惑的是,无论如何都会自动忽略任何引用类型 - 那么为什么会出现错误呢?我并没有尝试保存此属性,但我必须在保存之前进行额外的工作,将其剥离,因为它会引发错误。
    • 我没有意识到引用类型被忽略了。但是string 不是引用类型吗?
    • Uuuhhh,你有我在。我误用了引用类型这个术语——我的意思是一个引用另一个类的属性。所以在上面的例子中,About 和 From 属性都是对另一种类型的引用。 From 属性始终是 Person 类型。但是 Azure 表服务会忽略此属性 - 没有错误,但绝对不会以任何方式保存。但是 From 是 ICommentable 类型的属性,如果它有值,则会导致错误。
    • @AndrewBSchultz 有趣。我认为每个公共财产都与实体一起保存。
    • 现在我很不舒服,因为你是专家,也许我错了。但根据我的经验,这些东西并没有被保存。我的意思是它会怎么样 - 它会进入堆然后抓取引用的对象并保存它吗?因为 Person 不是您的链接所说的可以保存的类型之一。
    【解决方案2】:

    Azure 表存储客户端不支持控制哪些属性可持久化的精细方法。

    您可能希望查看我在 CodePlex 上的开源项目,该项目允许对哪些字段/属性持久保存到表存储以及如何序列化它们进行精细控制。 (http://lucifurestash.codeplex.com/)

    编辑:修正错字+澄清。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 2011-06-17
      • 1970-01-01
      • 2017-02-03
      相关资源
      最近更新 更多