0

我有一个关于如何将我的类映射到 Azure 表存储实体的问题。假设我有两个实体,BikeRider 和 BikeRace。在我的 C# 代码中,我有 2 个类,每个类都有一个属性,它是另一个类的集合。所以 BikeRider 类有一个 List 属性,反之亦然。如果这里不理想,请随意发表意见,但这就是我今天所拥有的。

那如何映射到 Azure 表中?我在这里找到了关于 SO 的问题,讨论如何存储多对多关系,但我的问题更具体地说是在保存包含该属性的对象时应该如何处理 List 属性。

谢谢!

更新当我在等待对此的回复时(并且认为我可能没有得到任何回复),我想出了这个解决方案:

如上所述,C# BikeRider 和 BikeRace 类型都具有另一个类型的 List 属性。每个都有一个实例方法来将另一个实例添加到他们的列表中(即 BikeRace 有一个名为“AddBikeRider”的方法,它将 BikeRider 的实例添加到 BikeRace.BikeRiders 列表中,反之亦然)。

但是,当我保存到 Azure 表存储时,有 3 个表包含以下信息:

自行车骑手表

  • 分区键、行键、

BikeRider 信息 RiderRace 表

  • PartitionKey:BikeRider RowKey
  • RowKey:BikeRace RowKey
  • 其他信息

自行车赛表

  • 分区键、行键
  • 比赛中每个 BikeRider 的 ID 的单独值(BikeRider RowKey - 但可能有很多)。

这样,如果您从 BikeRider 查询并尝试获取他参加过的 BikeRaces,则您拥有分区键,并且该分区中的所有行都是 BikeRaces。如果您从 BikeRace 进行查询,并尝试让所有 BikeRiders 参加比赛,则您拥有 BikeRider ID 可用于查询 BikeRider 表。除了将这些密钥存储在多个位置之外,您不会复制数据,因此如果您的数据发生更改,您不必多个存储位置。

这里的挑战是 Ming 发布的内容 - 如果 Table Service 保存方法为具有 List 属性的类型抛出异常,您是否可以使用自己的初步保存方法创建一个更简单的接口来处理列表类型并将其转换为保存 -首先能够数据类型,以我描述的方式将其持久保存到 Azure 表?这是太复杂了,还是太脆弱了?

4

1 回答 1

1

这是不支持的。表存储不支持列表属性。如果在 CLR 数据模型中使用列表属性,WCF 数据服务将尝试对其进行序列化,并导致异常。

要模拟关系,您可以在 BikeRace 实体上创建一个属性,例如 BikeRiderID。

如果需要只读集合,可以在 BikeRider 类中创建方法(而不是属性),例如 GetBikeRaces。在实现中,您查询 BikeRace 表以查找 BikeRiderID 是当前骑车人 ID 的所有实体。如果要更新自行车比赛列表,还需要使用单独的请求更新 BikeRider 表。

您可以参考http://blog.smarx.com/posts/one-to-many-relationships-in-windows-azure-tables获取示例。

于 2012-06-04T02:51:22.133 回答