2016-06-09 19 views
5

Recentemente mi sono reso conto che DocumentDB supporta operazioni di aggiornamento indipendenti tramite ReplaceDocumentAsync.DocumentDB Sostituisci non funzionante

Ho sostituito l'operazione Upsert di seguito con l'operazione Sostituisci.

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

Quindi questo è ora:

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

Tuttavia, ora ottengo l'eccezione:

Microsoft.Azure.Documents.BadRequestException: ResourceType documento è inaspettato. ActivityId: b1b2fd71-3029-4d0d-bd5d-87d8d0a2fc95

Nessuna idea perché, upsert e sostituire sono della stessa vena e l'oggetto è lo stesso che ha lavorato per upsert, quindi mi aspetto di lavorare senza problemi .

Tutti apprezzati.

Grazie

Aggiornamento: hanno cercato di implementare questo utilizzando l'approccio SelfLink, e funziona per Sostituire, ma selflink non funziona con upsert. Il comportamento è abbastanza confuso. Non mi piace il fatto che devo creare un self link nel codice usando la concatenazione di stringhe.

risposta

3

Ho paura che la creazione del collegamento tra loro con concatenazione di stringhe sia l'unica opzione qui perché ReplaceDocument(...) richiede un collegamento al documento. Mostra un link alla collezione nel tuo esempio. Non aspira l'id e trova il documento come si potrebbe desiderare.

Il modulo NPM, documentdb-utils, dispone di funzioni di libreria per la creazione di questi collegamenti, ma utilizza solo la concatenazione di stringhe. Ho visto una libreria equivalente per .NET ma non riesco a ricordare dove. Forse era in un esempio di Azure o anche nell'SDK ora.

+0

Quello che mi prende è la discrepanza di comportamento tra Create/Replace/upsert/e Delete. I metodi con lo stesso footprint e i relativi nomi si comportano in modo completamente diverso. Molto deluso da questo. –

+0

Ci si abitua abbastanza velocemente. :-) –

+1

Direi che questo è in realtà intuitivo.In una creazione, non si dispone ancora di un record nel database e, pertanto, un 'ID' non è richiesto per specificare informazioni adeguate per eseguire l'operazione. Ma un aggiornamento richiede un riferimento al record che stai cercando di aggiornare/sostituire. Pertanto, non si vuole costruire una raccolta uri, ma un documento uri invece in questo caso. –

2

Si può costruire un collegamento a un documento per una sostituzione utilizzando la classe UriFactory helper:

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

Purtroppo non è molto intuitivo, come Larry ha già fatto notare, ma una sostituzione si aspetta un documento di essere già lì, mentre un upsert è quello che dice sulla latta. Due diversi casi d'uso, direi.

1

Per aggiornare un documento, è necessario fornire la Collection Uri. Se si fornisce il documento URI, viene restituito quanto segue:

ResourceType Il documento è inatteso.

Forse il _collectionUri è un URI documento, l'assegnazione dovrebbe essere così:

_collectionUri = UriFactory.CreateDocumentCollectionUri(DatabaseName, CollectionName);