【问题标题】:Azure Table and Entity InheritanceAzure 表和实体继承
【发布时间】:2011-08-21 23:44:30
【问题描述】:

假设我正在为兽医和他们照顾的动物建立一个数据库。我有以下实体:

类动物:TableServiceEntity
类狗:动物
类猫:动物

狗和猫各有独特的属性。我有一个名为 Vets 的 Azure 表,其中 vet.Guid 作为分区键,“Dog_”+ dog.Guid 或“Cat_”+ cat.Guid 作为行键。如果我要使用 AsTableServiceQuery() 检索所有内容,我是否可以将动物实体投射到 Dog 或 Cat 并保持这些独特属性完好无损?

从更广泛的意义上说,在这种情况下,每个人都如何权衡取舍?在将 Dog 和 Cat 保存在一个表中以进行高效查询但在业务层中增加额外步骤和使用单独的表进行额外查询但不那么混乱的代码之间?

【问题讨论】:

    标签: inheritance database-design entity azure-storage


    【解决方案1】:

    要记住的是,Windows Azure 表中的数据会以 AtomPub 格式返回给您。因此,您有一个将 XML 映射到 DTO 上的公共属性的序列化过程。您可以指定在额外或缺少属性的情况下要做什么(视为错误或忽略)。此外,您可以选择自己通过挂钩 ReadingEntity 事件来覆盖序列化过程。

    因此,就您的问题而言,您需要记住,如果您要序列化为 Animal,则不能强制转换为 Dog,因为您需要在运行时指定序列化类型。例如

    ctx.CreateQuery<TypeToSerialize>().Where(s => s.Property == blah);
    

    如果你选择 TypeToSerialize 作为 Dog,你总是可以向下转换为 Animal,但这可能没那么有用。但是,如果您选择 TypeToSerialize 作为 Animal,那么 Dog 所拥有的信息就会丢失,因为它不会在任何地方被序列化并且实际上会被忽略。

    我提到 ReadingEvent 的原因是您可以自己处理序列化,然后所有的赌注都被取消了。您可以检查返回的属性并决定您希望序列化的类型,或者您可以将额外的属性存储到属性包中,等等。

    HTH

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-19
      • 1970-01-01
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-31
      • 2013-04-21
      • 1970-01-01
      相关资源
      最近更新 更多