azure table 存储复杂类型

azure table store with complex types

当对象包含 table 实体对象列表时,我对如何从 azure tables 中获取对象感到困惑。这是我要存储的内容的示例

public class Class1 : TableEntity
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
    public List<Class2> Items { get; set; }
}

public class Class2 : TableEntity
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}

现在我正在尝试按用户 ID 进行分区,然后每个 class 1 都会有一个具有某个 ID 的行键,这样我就可以获得给定用户的 class1 列表,或者我可以通过了解用户和 ID 获得单个 class1 对象。我来自 sql 世界,对 table 存储是全新的,所以我可能对这整件事的思考不正确。

当我尝试将 Class1 保存到 table 存储时,除列表外的所有内容都会保存。什么是存储 class 1 个对象的最佳方式?这甚至可能吗?我也在想,也许我不应该将列表存储在与主对象相同的 table 中。在某些情况下,我需要编辑列表中的单个项目,但如果我将它们全部存储在一个 table 中,我将不得不拉出整个对象并从列表中找到我想要的项目编辑并放回整个对象。

我一直在阅读 azure table 存储入门指南,但对于我在这里看到的场景似乎没有任何意义。

List 不是受支持的 table 存储类型,任何其他集合,.net 中的 Ienumerable 类型都不是。您可以将列表 属性 转换为 Json 字符串,然后就可以了。当然,您可以将整个对象转换为 json 字符串并写入 table 但这就像使用像 blob 存储这样的天蓝色 table 存储。您还可以考虑使用 json 文档数据库数据模型的 azure cosmos db。您可以像创建 json 文档并将其保存到 azure cosmos db 一样编写列表和其他 属性 类型。

可能我要补充的一个评论是,只要您的复杂类型没有 IEnumerable、ICollection 类型属性,实际上就可以将复杂类型写入和读取到天蓝色 table 存储。所以你可能有一个对象 A,它可能具有复杂类型 B 和 C 的属性,它们可能有自己的属性等。将这些类型的对象写入和读取到 table 存储的方法是使用最近添加的 TableEntity.FlattenConvertBack 方法(> v8.0.0.0 of Azure Storage .NET SDK)。

这些 api 将使用嵌套的复杂属性处理扁平化复杂对象,并在透明地从 azure table 存储读取时转换回原始复杂对象。需要注意的是它们不支持 IEnumerableICollection 类型的属性。关于将复杂类型写入 table 存储的主题,我仍然认为提及这一点会很好。

更新: 我扩展了 ObjectFlattenerRecomposer Nuget 包(这是 Azure 存储 SDK 中 TableEntity.Flatten / ConvertBack<T> api 的原始源代码)以支持 IEnumerable 类型。所以这个包的工作原理完全按照下面解释的扁平化/重组复杂对象,但它现在也处理 IEnumerables。

您可以在这里尝试:https://www.nuget.org/packages/ObjectFlattenerRecomposer/