DocumentDB ReplaceDocument失败

时间:2015-04-19 03:48:19

标签: c# .net azure azure-cosmosdb

在使用.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; }
    ...
}

我做错了什么?

5 个答案:

答案 0 :(得分:15)

好的,我明白了。

DocumentDB中的每个文档都需要具有“id”属性。如果一个类没有一个,它将被分配一个并保存到文档中。由于DocumentDB区分大小写,我的“Id”只是另一个属性,并添加了一个单独的“id”并分配给文档。

我通过使用Id的以下属性删除并重新创建我的所有文档来修复此问题:

[JsonProperty(PropertyName = "id")]
public Guid Id { get; set; }

答案 1 :(得分:1)

这也可能对某人有所帮助。我最近遇到了这个问题,并意识到Microsoft.Azure.DocumentDB.Core使用的是Newtonsoft.Json的9.0.1。我的项目引用了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属性但仍然存在问题的任何人。

答案 2 :(得分:1)

或者,您可以告诉Cosmos使用camelCasingWhichIsStandardForJson

new CosmosClient(
  connectionstring,
  new CosmosClientOptions(){
    SerializerOptions = new CosmosSerializationOptions(){
      PropertyNamingPolicy = CosmosPropertyNamingPolicy.CamelCase
    }

  }
)

答案 3 :(得分:0)

正如Hossein所说,您可以修改您的类以将属性序列化为“id”(区分大小写)。

或者,可以这样做:

dynamic json = JObject.FromObject(item);
json.id = doc.Id;
var document = await Client.ReplaceDocumentAsync(doc.SelfLink, json);

因此不强制项目实现它自己的'id'属性。

答案 4 :(得分:-5)

您必须检查ID = null

Document doc = Client.CreateDocumentQuery(Collection.DocumentsLink)
            .Where(d => d.Id != null)
            .Where(d => d.Id == id)
            .AsEnumerable()
            .FirstOrDefault();
​