具有复杂类型的 azure 表存储

Mat*_*ble 1 azure azure-table-storage

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

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; }
}
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试按用户 id 进行分区,然后每个类 1 都有一个 id 的行键,这样我就可以获得class1给定用户的列表,或者我可以class1通过知道用户和 id来获取单个对象。我来自 sql 世界,并且是表存储的新手,所以我可能会错误地考虑这整个事情。

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

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

Dog*_*lan 5

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

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

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

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

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