Azure表和实体继承

时间:2011-05-09 20:48:46

标签: inheritance database-design entity azure-storage

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

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

狗和猫各有独特的属性。我有一个名为Vets的Azure表,其中vet.Guid作为分区键,“Dog_”+ dog.Guid或“Cat_”+ cat.Guid作为行键。如果我通过使用AsTableServiceQuery()来检索所有内容,那么我可以将动物实体转换为Dog或Cat,并保留这些独特的属性吗?

从广义上讲,在这种情况下,每个人都会采取什么样的权衡方式?在将Dog和Cat保存在一个表中以进行有效查询但在业务层中增加额外步骤并使用额外查询但不太混乱的代码的单独表之间?

1 个答案:

答案 0 :(得分:4)

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

因此,在您的问题的上下文中,您需要记住,如果您要序列化为Animal,则无法转换为Dog,因为您需要在运行时指定序列化类型。 E.g。

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

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

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

HTH

相关问题