关于如何将类映射到Azure表存储实体,我有一个问题。假设我有两个实体,BikeRider和BikeRace。在我的C#代码中,我有两个类,每个类都有一个属性,它是另一个类的集合。因此,BikeRider类具有List属性,反之亦然。如果这不是理想的话,那就随便说吧,但这就是我今天要做的。
那张地图是怎么变成蓝色桌子的?我在这里发现了一些问题,这些问题讨论了如何存储多个到多个关系,但我的问题是,在保存包含该属性的对象时,应该如何处理List属性。
谢谢!
当我在等待回复时更新(并认为我可能没有得到任何回复),我想出了以下解决方案:
正如我前面所述,C# BikeRider和BikeRace类型都具有另一种类型的List属性。每个实例都有一个实例方法来将另一个实例添加到他们的列表中(即BikeRace有一个名为"AddBikeRider“的方法,它将BikeRider的一个实例添加到BikeRace.BikeRiders列表中,反之亦然)。
但是,当我保存到Azure表存储时,有3个表包含以下信息:
BikeRider表
BikeRider信息RiderRace表
BikeRace表
这样,如果您从BikeRider查询并试图获取他所在的BikeRaces,那么您就有了分区键,并且该分区中的所有行都是BikeRaces。如果您是从BikeRace查询,并试图在一个竞赛中获取所有BikeRiders,则可以使用BikeRider ID来查询BikeRider表。除了将这些键存储在多个位置之外,您不会复制数据,因此,如果数据更改,您就不必使用多个存储位置。
这里的挑战是明发布了什么--如果Tables方法抛出一个带有List属性的类型的异常,您能否用它自己的初步保存方法创建一个更简单的接口,该方法首先处理列表类型并将其转换为可保存的数据类型,然后以我所描述的方式将其保存到Azure表中?这是太复杂,还是太脆弱?
发布于 2012-06-04 02:51:22
这是不支持的。表存储不支持列表属性。如果在CLR数据模型中使用list属性,WCF数据服务将尝试序列化它,并导致异常。
要模拟关系,可以在BikeRace实体(如BikeRiderID )上创建一个属性。
如果需要只读集合,可以在BikeRider类(如GetBikeRaces )中创建方法(而不是属性)。在实现中,查询BikeRace表以查找其BikeRiderID是当前自行车骑手ID的所有实体。如果要更新自行车竞赛列表,还需要使用单独的请求更新BikeRider表。
您可以参考http://blog.smarx.com/posts/one-to-many-relationships-in-windows-azure-tables获取一个示例。
https://stackoverflow.com/questions/10865791
复制相似问题