我正在用頭撞墻。我有一個函數(shù),基本上是一個名為 的 Upsert TryCreateOrUpdate。我確實意識到現(xiàn)在存在 upsert 函數(shù),但這是一些較舊的代碼。這是函數(shù):public static async Task<string> TryCreateOrUpdate<T>(T data) where T : ViewModelBase{ var options = string.IsNullOrWhiteSpace(data.PartitionKey) ? null : new RequestOptions { PartitionKey = new PartitionKey(data.PartitionKey) }; try { var response = await Client.CreateDocumentAsync(Collection.SelfLink, data, options, true); } catch (DocumentClientException dce) { switch (dce.StatusCode.Value) { ... case HttpStatusCode.Conflict: try { var link = UriFactory.CreateDocumentUri(_databaseId, _collectionId, data.Id); await Client.ReplaceDocumentAsync(link, item, options); } catch (Exception e) { return $"There was an error updating the document."; } break; default: ... } } catch (Exception e) { return "There was an unknown error creating the document."; } return "OK";}我正在嘗試插入一個 id 為 6 位數(shù)字的文檔作為字符串。我檢查了我的 Cosmos DB,可以確認(rèn)數(shù)據(jù)庫中沒有具有我嘗試更新插入的 id 的文檔。所以它應(yīng)該會導(dǎo)致創(chuàng)建。創(chuàng)建文檔的行拋出一個DocumentClientException:系統(tǒng)中已存在具有指定 ID 的實體。但是,替換代碼行會引發(fā)此異常:系統(tǒng)中不存在具有指定 ID 的實體。嗯什么?究竟存在還是不存在?!正如我所說,我在運行之前進行了檢查,發(fā)現(xiàn)該文檔不存在。我什至嘗試更改所有這些代碼以使用較新的代碼UpsertDocumentAsync,但仍然收到錯誤系統(tǒng)中已存在具有id的實體盡管正如我所說,該文件并不存在。
2 回答

慕斯王
TA貢獻1864條經(jīng)驗 獲得超2個贊
雖然我不太了解 CosmosDb 和相關(guān)包的內(nèi)部工作原理,因為它與此問題相關(guān),但原因似乎是重寫了基類中 Id 字段的編寫方式。
以前是這樣寫的:
public string id => Id;
public string Id { get; set; }
然后又改成了:
[JsonProperty("id")]
public string Id { get; set; }
請注意,id => Id 已被刪除?,F(xiàn)在它引起了問題。我們將其更改為:
public string id {
get { return Id; }
set { Id = value; }
}
public string Id { get; set; }
現(xiàn)在一切都像以前一樣。

POPMUISE
TA貢獻1765條經(jīng)驗 獲得超5個贊
我在嘗試創(chuàng)建文檔時遇到了完全相同的錯誤。盡管文檔的 ID 是唯一的,但我忘記了我在容器上配置了唯一的密鑰。由于使用 Azure 門戶(幾乎?)不可能找到在 Cosmos Db 中的容器上定義的唯一鍵,因此這一點很容易被忽視。
- 2 回答
- 0 關(guān)注
- 146 瀏覽
添加回答
舉報
0/150
提交
取消