区分Cosmos DB中的唯一约束违规

时间:2018-12-27 16:13:26

标签: c# azure azure-cosmosdb-sqlapi

我创建了一个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。另外,在另一种情况下,我可能希望集合具有多个唯一约束。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

尝试一下:

            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由于违反了唯一索引约束示例: {“代码”:“冲突”,“消息”:“消息:{\”错误\“:[\”唯一索引约束冲突。“”“} ...状态代码:冲突” ...}

409由于重复的ID: {“代码”:“冲突”,“消息”:“消息:{\”错误\“:[\”具有指定ID或名称的资源已存在。\“]} ...状态代码:冲突” ...}

Screen capture showing clarity for parsing text from exception.