DocumentDB ReplaceDocument Fails
Solution 1
OK I figured it out.
Each Document in DocumentDB needs to have an "id" property. If a class does not have one, it will get assigned one and saved into the document. With DocumentDB being case sensitive, my "Id" was just another property and a separate "id" was added and assigned to the document.
I fixed the issue by deleting and recreating all my documents with the following attribute for Id:
[JsonProperty(PropertyName = "id")]
public Guid Id { get; set; }
Solution 2
alternatively you can tell Cosmos to use camelCasingWhichIsStandardForJson
new CosmosClient(
connectionstring,
new CosmosClientOptions(){
SerializerOptions = new CosmosSerializationOptions(){
PropertyNamingPolicy = CosmosPropertyNamingPolicy.CamelCase
}
}
)
Solution 3
As Hossein noted, you can modify your class to serialize a property to 'id' (case sensitive).
Alternatively, one can do something like this:
dynamic json = JObject.FromObject(item);
json.id = doc.Id;
var document = await Client.ReplaceDocumentAsync(doc.SelfLink, json);
Thus not forcing item to implement it's own 'id' property.
Solution 4
This may help someone also. I had this issue recently and realized that Microsoft.Azure.DocumentDB.Core uses 9.0.1 of Newtonsoft.Json. My project was referencing 11.0.2. So my Upserts or Replaces would cause this error or a new document creation. Downgrading to the lowest version of Newtonsoft.Json that I could go 10.0.2 removed the error.
My class had the proper [JsonProperty( PropertyName = "id")] attribute but I am assuming there is a difference in how the serialzation happens with JsonProperty attribute in 11.0.2 as appose to the 9.0.1 Microsoft.Azure.DocumentDB.Core relies on.
FYI: I could only go as low as Newtonsoft.Json 10.0.2, this is due to WindowsAzure.Storage 9.3.1 is reliant on Newtonsoft.Json 10.0.2 version. I hope this helps anyone also facing this issue that has the property jsonproperty attribute but still having issues.
Hossein
A/B Testing framework for ASP.NET MVC Applications: A/B Test Master: http://diy.abtestmaster.com/developers/ Nuget: http://www.nuget.org/packages/AbTestMaster/ Github: https://github.com/htayebi/AbTestMaster/
Updated on June 13, 2022Comments
-
Hossein about 2 years
In Azure DocumentDB using .NET SDK, I get the following error when calling ReplaceDocumentAsync:
"Errors":["The input content is invalid because the required properties - 'id; ' - are missing","The request payload is invalid. Ensure to provide a valid request payload."]
It's a blog post scenario, when a new comment is added, I get the document, add the comment and call ReplaceDocumentAsync. Here's how I do it:
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);
Post class:
public class Post { public Post() { Comments = new List<Comment>(); } public Guid Id { get; set; } public List<Comment> Comments { get; set; } ... }
What am I doing wrong?