2016-06-09 102 views
5

我最近意識到DocumentDB通過ReplaceDocumentAsync支持獨立更新操作。DocumentDB替換不工作

我用Replace操作替換了下面的Upsert操作。

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

所以這是現在:

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

不過,現在我得到異常:

Microsoft.Azure.Documents.BadRequestException:文檔的ResourceType是意想不到的。 ActivityId:b1b2fd71-3029-4d0d-bd5d-87d8d0a2fc95

不知道爲什麼,UPSERT和替換是同樣的和對象是,UPSERT工作一樣,所以我希望它沒有問題工作。

所有幫助表示讚賞。

感謝

更新:試過這種使用SelfLink的方法來實現,它適用於更換,但selflink不工作的Upsert。這種行爲相當混亂。我不喜歡我必須使用字符串連接在代碼中構建自連接。

回答

3

恐怕建立與字符串連接的自連接是您的唯一選擇,因爲ReplaceDocument(...)需要鏈接到文檔。您在示例中顯示了該集合的鏈接。它不會吸引編號並根據您的需要查找文檔。

NPM模塊documentdb-utils具有用於構建這些鏈接的庫函數,但它只是使用字符串連接。我已經看到了.NET的等價庫,但我不記得在哪裏。也許它現在在Azure示例中,甚至在SDK中。

+0

什麼讓我爲創建/替換/的Upsert /和Delete之間的行爲差​​異。具有相同腳印和相關名稱的方法表現完全不同。對此非常失望。 –

+0

你已經習慣了很快。 :-) –

+1

我會說這實際上是直觀的。在創建中,db中沒有記錄,因此不需要'Id'來指定足夠的信息來執行操作。但更新需要參考您嘗試更新/替換的記錄。因此,在這種情況下,您不想構建集合uri,而是構建一個uri文檔。 –

2

您可以構建一個文檔鏈接的替換使用UriFactory輔助類:

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

可惜這不是很直觀,拉里已經指出的那樣,而是一種替代需要一個文件已經在那裏了,而一個upsert是它在錫上所說的。我會說兩種不同的用例。

1

爲了更新文檔,您需要提供Collection Uri。如果您提供Document Uri,則返回以下內容:

ResourceType Document是意外的。

也許_collectionUri是一個開放的文檔,分配應該是這樣的:

_collectionUri = UriFactory.CreateDocumentCollectionUri(DatabaseName, CollectionName);