我创建了一个 Cosmos DB 集合来存储用户。该集合对电子邮件地址有唯一的限制。用户的 id 是一个 Guid。当我将用户添加到集合中时,当 Guid 已经存在以及电子邮件地址已经存在时,会引发 HttpStatusCode Conflict 异常。 有没有办法知道哪个约束导致了错误?
独特的约束是这样添加的:
myCollection.UniqueKeyPolicy = new UniqueKeyPolicy
{
UniqueKeys =
new Collection<UniqueKey>
{
new UniqueKey { Paths = new Collection<string> { "/EmailAddress/Address" }},
}
};
调用 CreateDocumentAsync 后发生(预期的)异常,我捕获如下异常:
catch (DocumentClientException e)
{
if (e.StatusCode == System.Net.HttpStatusCode.Conflict)
{
// I can't find anything in the Exception that indicates what constraint was violated
}
}
e.Error 包含:
{
"code":"Conflict",
"message":"Message: {\"Errors\":[\"Unique index constraint violation.\"]}\r\nActivityId: 3....6, Request URI: /apps/3....b/services/9....f/partitions/b....4/replicas/131903490859125028p/, RequestStats: \r\nRequestStartTime: 2018-12-27T15:56:06.4927341Z, Number of regions attempted: 1\r\n, SDK: Microsoft.Azure.Documents.Common/2.1.0.0"
}
我想要区分的原因是这样我可以向客户端返回更好的消息。我知道 Guid 通常是唯一的,但客户端可以在现有实体上调用 CreateDocumentAsync。另外,在另一种情况下,我可能需要对集合进行多个唯一约束。
有什么想法吗?
最佳答案
试试这个:
catch ( Microsoft.Azure.Documents.DocumentClientException ex )
{
if ( ex.StatusCode == System.Net.HttpStatusCode.Conflict )
{
// Unique key constraint violation ...
}
else
{
// Some other issue ...
throw;
}
How to check for unique key constraint violations / exceptions
产品组更新:
目前我们不公开子状态代码来区分 ID 冲突和唯一冲突(甚至更详细地说这种唯一冲突涉及哪种唯一索引)。正如所建议的,可以使用错误消息文本。
建议的解决方法:
409 由于唯一索引约束违规示例: {"code":"冲突","message":"消息: {\"错误\":[\"违反唯一索引约束。\"]} ... StatusCode: 冲突"...}
由于 ID 重复而导致 409: {"code":"冲突","message":"消息: {\"错误\":[\"具有指定 ID 或名称的资源已存在。\"]} ... StatusCode: 冲突"...}
关于c# - 区分 Cosmos DB 中的唯一约束违规,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53947865/