在使用.NET SDK的Azure DocumentDB中,调用ReplaceDocumentAsync时出现以下错误:
“错误”:[“输入内容无效,因为所需的属性 - 'id;' - 缺失”,“请求有效负载无效。确保提供有效的请求有效负载。”]
这是博客文章的场景,当添加新评论时,我获取文档,添加评论并调用ReplaceDocumentAsync。我是这样做的:
string query = "SELECT * FROM Posts p WHERE p.id = 'some guid'";
var post = Client.CreateDocumentQuery<Post>(Collection.DocumentsLink, query)
.AsEnumerable().FirstOrDefault();
post.Comments.Add(comment);
Document doc = Client.CreateDocumentQuery(Collection.DocumentsLink)
.Where(d => d.Id == id)
.AsEnumerable()
.FirstOrDefault();
var document = await Client.ReplaceDocumentAsync(doc.SelfLink, item);
发布课程:
public class Post
{
public Post()
{
Comments = new List<Comment>();
}
public Guid Id { get; set; }
public List<Comment> Comments { get; set; }
...
}
我究竟做错了什么?
好的,我明白了。
DocumentDB中的每个Document都需要具有“id”属性。如果一个类没有一个,它将被分配一个并保存到文档中。由于DocumentDB区分大小写,我的“Id”只是另一个属性,并添加了一个单独的“id”并分配给文档。
我通过使用Id的以下属性删除并重新创建我的所有文档来修复此问题:
[JsonProperty(PropertyName = "id")]
public Guid Id { get; set; }
这也可以帮助某人。我最近遇到了这个问题,并意识到Microsoft.Azure.DocumentDB.Core使用9.0.0的Newtonsoft.Json。我的项目引用了11.0.2。所以我的Upserts或Replaces会导致此错误或新文档创建。降级到最低版本的Newtonsoft.Json,我可以去10.0.2删除错误。
我的类有适当的[JsonProperty(PropertyName =“id”)]属性,但我假设11.0.2中的JsonProperty属性与9.0.1 Microsoft.Azure.DocumentDB.Core相同的序列化方式有所不同。依靠。
仅供参考:我只能和Newtonsoft.Json 10.0.2一样低,这是由于WindowsAzure.Storage 9.3.1依赖于Newtonsoft.Json 10.0.2版本。我希望这有助于任何人也面临这个具有属性jsonproperty属性但仍然存在问题的问题。
正如Hossein所指出的,您可以修改您的类以将属性序列化为“id”(区分大小写)。
或者,人们可以这样做:
dynamic json = JObject.FromObject(item);
json.id = doc.Id;
var document = await Client.ReplaceDocumentAsync(doc.SelfLink, json);
因此,不强制项目实现它自己的'id'属性。
你必须检查ID = null
Document doc = Client.CreateDocumentQuery(Collection.DocumentsLink)
.Where(d => d.Id != null)
.Where(d => d.Id == id)
.AsEnumerable()
.FirstOrDefault();