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 库。请注意,this 是 REST API 文档 而不是 客户端库文档。在客户端库的当前实现中,ITableEntity
中缺少的属性在反序列化来自 Azure 存储 Table 服务的查询响应时保留为 null
。
null
值 属性 永远不会 在服务端持久化,无论执行 replace
或 merge
操作。
例如,如果先前持久化的实体在服务端是{"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}
。
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 库。请注意,this 是 REST API 文档 而不是 客户端库文档。在客户端库的当前实现中,ITableEntity
中缺少的属性在反序列化来自 Azure 存储 Table 服务的查询响应时保留为 null
。
null
值 属性 永远不会 在服务端持久化,无论执行 replace
或 merge
操作。
例如,如果先前持久化的实体在服务端是{"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}
。