2015-04-19 2 views
5
Fails

In Azure DocumentDB mit .NET SDK, ich folgende Fehlermeldung erhalten, wenn ReplaceDocumentAsync Aufruf:DocumentDB ReplaceDocument

"Fehler": [ "Der Eingangs Inhalt ist ungültig, da die geforderten Eigenschaften - 'id;' - fehlen "," Die Anforderungsnutzdaten sind ungültig. Stellen Sie sicher, dass Sie eine gültige Anforderungsnutzlast bereitstellen. "]

Es ist ein Blogpostszenario. Wenn ein neuer Kommentar hinzugefügt wird, erhalte ich das Dokument, füge den Kommentar hinzu und rufe ReplaceDocumentAsync auf. Hier ist, wie ich es tun:

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

Beitrag Klasse:

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

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

Was mache ich falsch?

Antwort

10

OK ich es herausgefunden.

Jedes Dokument in DocumentDB muss eine "ID" -Eigenschaft haben. Wenn eine Klasse keine hat, wird sie einer zugeordnet und im Dokument gespeichert. Da DocumentDB die Groß-/Kleinschreibung berücksichtigt, war meine "Id" nur eine weitere Eigenschaft und eine separate "ID" wurde hinzugefügt und dem Dokument zugewiesen.

ich das Problem behoben durch das Löschen und mit dem folgenden Attribut für Id alle meine Dokumente neu zu erstellen:

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

Yup - Sie müssen sicherstellen, dass die ID im Hauptteil des zu ersetzenden Dokuments eingetragen ist. Nur zur Verdeutlichung - eine ID wird nur automatisch generiert, wenn sie beim Erstellen eines Dokuments nicht existiert. 'id' wird beim Ersetzen nicht automatisch generiert (daher die Fehlermeldung). –

+0

Gibt es eine Möglichkeit, den Namen dieser Eigenschaft zu ändern, die DocumentDb erwartet (im Gegensatz zum Hinzufügen des Attributs 'JsonProperty' zum Objekt oder JObject (aus verschiedenen komplexen und kontextsensitiven Gründen kann ich das nicht so einfach tun) Sagen Sie beispielsweise DocumentDb, anstelle von "id?" "Id" oder "DocId" oder etwas Ähnliches zu verwenden. –

-4

Sie haben für ID überprüfen = null

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

0

Wie Hossein bemerkt, können Sie Ihre Klasse ändern können, eine Eigenschaft ‚id‘ (Groß- und Kleinschreibung) serialisiert .

Alternativ kann man so etwas tun:

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

So nicht Gegenstand zwingt seine eigene ‚id‘ Eigenschaft zu implementieren.