C# Azure存储表中的InsertOrUpdate与InsertOrMerge有什么区别?

C# Azure存储表中的InsertOrUpdate与InsertOrMerge有什么区别?,c#,azure-storage,azure-table-storage,C#,Azure Storage,Azure Table Storage,在查看了这两种方法的Microsoft文档之后,我看不出这两种方法之间有什么区别,或者我遗漏了什么。我用InsertOrMerge做了一些实验,但它所做的只是用新数据替换旧数据 InsertOrUpdate=替换整个实体,包括删除新实体中未定义的任何字段 InsertOrMerge=如果新实体不包含旧字段和值,则会保留这些字段和值,并且会更新所有其他字段 Windows Azure表提供的两个Upsert API是 InsertOrReplace实体和InsertOrMerge实体定义为 如下

在查看了这两种方法的Microsoft文档之后,我看不出这两种方法之间有什么区别,或者我遗漏了什么。我用InsertOrMerge做了一些实验,但它所做的只是用新数据替换旧数据

InsertOrUpdate=替换整个实体,包括删除新实体中未定义的任何字段

InsertOrMerge=如果新实体不包含旧字段和值,则会保留这些字段和值,并且会更新所有其他字段

Windows Azure表提供的两个Upsert API是 InsertOrReplace实体和InsertOrMerge实体定义为 如下:

  • :如API名称所示,如果实体未插入,InsertOrReplace实体将插入该实体 存在,或者如果实体存在,则替换现有实体。这意味着 一旦操作成功完成,表将包含 具有InsertOrReplace中定义的属性的新实体 实体请求,替换先前的实体及其属性(如果 以前存在过
  • :InsertOrMerge Entity将在实体不存在时插入该实体,或者在实体存在时插入合并 提供的实体属性与已存在的实体属性相同。一旦 操作成功完成后,该表将包含 向实体提供了请求中提供的更新属性。在里面 换句话说,如果实体存在,API将具有相同的效果 as,其中结果实体是 现有和更新属性之间的属性

现在这完全有道理了。感谢链接这里要指出的一件重要的事情是,对于InsertOrReplace和InsertOrMerge,表服务忽略了Etag,即使它已定义。因此,最终可能会替换或合并实体的旧版本。据我所知,这些API的版本没有一个是有点不幸的。@ DoguArslan,我认为API设计是合理的。如果你知道这个实体的ETAG值,你必须已经从Azure表存储服务端获得了这个实体,因此,您应该调用Replace/Merge API,而不是InsertOrReplace/InsertOrMerge API。对于简单的用例来说,这基本上是正确的,但如果您正在处理全局分布式系统和最终的一致性,则情况并非总是如此。从中读取实体的表和要合并到的表可能是不同的表。我认为如果api让客户端决定省略Etag via*作为其他非插入版本会更好。1。实际上,InsertOrMerge API与Merge API共享相同的HTTP谓词和请求Uri。它们之间唯一的区别是它们的请求是否包含HTTP头“if Match”(对于ETag)。因此,如果您指定ETag(实值或*),那么您已经在使用合并API了。2.如果从一个表中读取实体,然后将其合并到其他表中,您不应该假设ETag功能仍然可以跨表工作,因为ETag仅针对每个API协定的同一表上的同一实体设计。1是实现细节,即,可以使用自定义头来区分Merge和InsertAndMerge,以及是否可以独立处理匹配。不清楚你的第二点我们称之为InsertAnd。。方法通过sdk。虽然我们自己在客户端实现了insertAndConditionalMerge替换方法,但如果服务在本地支持它们,效果会更好。我们可能超出了问题的范围,所以我可能会在这里打开一个不同的主题,或者在github中打开一个请求。