Azure Table 存储和 Null 属性 值 - 误导性文档?

Azure Table Storage and Null Property Values - Misleading Doc?

documentation 声明如下:

The Table service does not persist null values for properties. When querying entities, the above property types are all non-nullable. When writing entities, the above property types are all nullable, and any property with a null value is handled as if the payload did not contain that property.

我将我感兴趣的文字加粗了。

乍一看,在我看来,类型的实体属性在从一行中读取实体后永远不会null。这当然是不真实的,已通过测试验证。

我显然误读了文档。本文档专门针对 REST 响应的行为,因此真正发生的是 REST 响应只是忽略了它没有存储值的属性。因此,通过不保留任何 null 值,REST 结果中的任何属性都保证为非空,而那些本应为 null 的属性在响应中根本不存在(只要具有空属性的实体在写入时被替换,而不是合并。

因此,映射到 ITableEntity 实现的 REST 响应中缺少的属性必须推断为 null

此外,要确保 null 值实际上是 "persisted",必须替换而不是合并实体。

我的分析是否正确?

如果是,那么是否应该更新文档以使其更清楚?好像有点乱。

文档意味着 null 值 属性 不会保留在 Azure 存储 Table service 中,这与执行 client 库。请注意,thisREST API 文档 而不是 客户端库文档。在客户端库的当前实现中,ITableEntity 中缺少的属性在反序列化来自 Azure 存储 Table 服务的查询响应时保留为 null

null 值 属性 永远不会 在服务端持久化,无论执行 replacemerge 操作。

例如,如果先前持久化的实体在服务端是{"a":1, "b":2},并且使用负载{"a":null, "b":3, "c":4}执行merge操作,则新持久化的实体将是{"a":1, "b":3, "c":4} 在服务端。作为比较,如果执行的操作是replace,有效负载{"a":null, "b":3, "c":4},新持久化的实体在服务端将是{"b":3, "c":4}