2016-06-09 4 views
5

Ich habe vor kurzem festgestellt, dass DocumentDB Standalone-Update-Operationen über ReplaceDocumentAsync unterstützt.DocumentDB Ersetzen funktioniert nicht

Ich habe den Upsert-Vorgang unten durch den Vorgang Ersetzen ersetzt.

var result = _client 
    .UpsertDocumentAsync(_collectionUri, docObject) 
    .Result; 

Das ist also jetzt:

var result = _client 
    .ReplaceDocumentAsnyc(_collectionUri, docObject) 
    .Result; 

Aber jetzt bekomme ich die Ausnahme:

Microsoft.Azure.Documents.BadRequestException: Resource Dokument ist unerwartet. ActivityId: b1b2fd71-3029-4d0d-bd5d-87d8d0a2fc95

Keine Ahnung, warum, Upsert und ersetzen sind von der gleichen Ader und das Objekt ist das gleiche, die für Upsert gearbeitet, so würde ich erwarten, dass es ohne Probleme arbeitet .

Alle Hilfe wird geschätzt.

Dank

Update: Haben Sie versucht dies mit dem SelfLink Ansatz zu implementieren, und es funktioniert für ersetzen, aber selflink mit Upsert funktioniert nicht. Das Verhalten ist ziemlich verwirrend. Ich mag es nicht, dass ich eine Self-Link in Code mit String-Verkettung erstellen muss.

Antwort

3

Ich fürchte, dass der Aufbau des Selflink mit String-Verkettung ist Ihre einzige Option hier, weil ReplaceDocument(...) erfordert einen Link zu dem Dokument. Sie zeigen in Ihrem Beispiel eine Verknüpfung zur Sammlung an. Es wird nicht die ID aus saugen und finden Sie das Dokument, wie Sie es wünschen.

Das NPM-Modul documentdb-utils verfügt über Bibliotheksfunktionen zum Erstellen dieser Verknüpfungen, verwendet jedoch nur die Verkettung von Zeichenfolgen. Ich habe eine gleichwertige Bibliothek für .NET gesehen, aber ich kann mich nicht erinnern, wo. Vielleicht war es jetzt in einem Azure-Beispiel oder sogar im SDK.

+0

Was mich bekommt, ist die Diskrepanz im Verhalten zwischen Erstellen/Ersetzen/Upsert/und Löschen. Methoden mit demselben Footprint und ähnlichen Namen verhalten sich völlig anders. Sehr enttäuscht von diesem. –

+0

Sie gewöhnen sich ziemlich schnell daran. :-) –

+1

Ich würde sagen, dass das eigentlich intuitiv ist.In einem create haben Sie noch keinen Datensatz in der db, und daher ist eine 'Id' nicht erforderlich, um angemessene Informationen anzugeben, um die Operation auszuführen. Ein Update benötigt jedoch einen Verweis auf den Datensatz, den Sie zu aktualisieren/ersetzen versuchen. Daher möchten Sie in diesem Fall kein Sammel-URI, sondern ein Dokument-URI erstellen. –

2

Sie können ein Dokument Link für eine bauen ersetzen die UriFactory Helfer-Klasse:

var result = _client 
    .ReplaceDocumentAsync(UriFactory.CreateDocumentUri(databaseId, collectionId, docObject.Id), docObject) 
    .Result; 

Leider sehr intuitiv, es ist nicht, wie Larry aus bereits erwähnt hat, sondern ein Ersatz erwartet ein Dokument bereits dort zu sein, während ein upsert ist, was es auf der Dose sagt. Zwei verschiedene Anwendungsfälle würde ich sagen.

1

Um ein Dokument zu aktualisieren, müssen Sie die Collection Uri bereitstellen. Wenn Sie das Dokument Uri angeben, gibt es Folgendes zurück:

ResourceType Dokument ist unerwartet.

Vielleicht ist das _collectionUri ein Dokument Uri, sollte die Zuordnung wie folgt aussehen:

_collectionUri = UriFactory.CreateDocumentCollectionUri(DatabaseName, CollectionName);