2015-04-19 9 views
5

W Azure DocumentDB użyciu .NET SDK, otrzymuję następujący błąd podczas wywoływania ReplaceDocumentAsync:DocumentDB ReplaceDocument zawodzi

„Błędy”: [ "Zawartość wejście jest nieważne, ponieważ wymagane właściwości -«id;»- brakuje "," Ładunek żądania jest nieważny. "] Zapewnienie ważnego ładunku żądania."]

Jest to scenariusz wpisu na blogu, po dodaniu nowego komentarza otrzymuję dokument, dodajemy komentarz i wywołuję ReplaceDocumentAsync. Oto jak to zrobić: class

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); 

postu:

public class Post 
{ 
    public Post() 
    { 
     Comments = new List<Comment>(); 
    } 

    public Guid Id { get; set; } 
    public List<Comment> Comments { get; set; } 
    ... 
} 

Co robię źle?

Odpowiedz

10

OK I zdobione.

Każdy dokument w DocumentDB musi mieć właściwość "id". Jeśli klasa go nie posiada, zostanie przypisana i zapisana w dokumencie. W przypadku, gdy w DocumentDB rozróżniana jest wielkość liter, mój "identyfikator" był tylko inną właściwością, a oddzielny "identyfikator" został dodany i przypisany do dokumentu.

Naprawiłem problem poprzez usunięcie i ponowne wszystkie moje dokumenty z poniższego atrybutu dla Id:

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

Yup - musisz upewnić się, że "id" znajduje się w treści zastępowanego dokumentu. Aby wyjaśnić - "identyfikator" jest generowany automatycznie tylko wtedy, gdy nie istnieje podczas tworzenia dokumentu. 'id' nie jest automatycznie generowany podczas zamiany (stąd komunikat o błędzie). –

+0

Czy istnieje sposób na zmianę nazwy tej właściwości, której oczekuje DocumentDb (w przeciwieństwie do dodawania atrybutu 'JsonProperty' do obiektu lub JObject (z różnych złożonych i kontekstowych powodów, nie mogę tego łatwo zrobić). na przykład, powiedz DocumentDb, aby użył "Id" lub "DocId" lub coś w tym stylu, zamiast "id?" –

-4

Trzeba sprawdzić ID = null

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

0

Jak zauważył Hossein, można zmodyfikować klasy serializować właściwość „id” (wielkość liter ma znaczenie) .

Alternatywnie, można zrobić coś takiego:

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

Zatem nie zmuszając element wdrożyć swój własny „id” własność.