Различать уникальные нарушения ограничений в Космос БД - PullRequest
0 голосов
/ 27 декабря 2018

Я создал коллекцию Cosmos DB для хранения пользователей.Эта коллекция имеет уникальное ограничение на адреса электронной почты.Идентификатор пользователя - Guid.Когда я добавляю пользователя в коллекцию, возникает исключение с конфликтом HttpStatusCode, когда Guid уже существует, а также когда адрес электронной почты уже существует.Есть ли способ узнать, какое ограничение вызвало ошибку?

Уникальное ограничение добавляется следующим образом:

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 голосов
/ 28 декабря 2018

Попробуйте:

            catch ( Microsoft.Azure.Documents.DocumentClientException ex )
        {

           if ( ex.StatusCode == System.Net.HttpStatusCode.Conflict )
           {

              // Unique key constraint violation ...

           }
           else
           {

              // Some other issue ...
              throw;

           }

Как проверить наличие / исключение уникальных ключевых ограничений

Обновление из группы продуктов:

В настоящее времямы не раскрываем код субсостояния, чтобы различать конфликт идентификаторов и уникальный конфликт (или даже более того, о каком уникальном индексе этот уникальный конфликт).Как было предложено, текст сообщения об ошибке может быть использован.

Рекомендуется обходное решение:

409 из-за примера нарушения ограничения уникального индекса: {"code": "Conflict", "message": "Message: {\"Ошибки \ ": [\" Уникальное нарушение ограничения индекса. \ "]} ... StatusCode: Conflict" ...}

409 из-за повторяющегося идентификатора: {"code": "Conflict", "message":" Сообщение: {\ "Ошибки \": [\ "Ресурс с указанным идентификатором или именем уже существует. \"]} ... StatusCode: Conflict "...}

Screen capture showing clarity for parsing text from exception.

...