Невозможно удалить конкретный документ из космоса БД через SDK? - PullRequest
0 голосов
/ 31 октября 2019

enter image description here Я использую DeleteDocumentAsync в соответствии с приведенным ниже кодом.

 public static void DeleteErrorLog(List<string> LogID, string collectionName)
        {
            FeedOptions queryOptions = new FeedOptions { EnableCrossPartitionQuery = true };
            try
            {
                //getting resource id for a document with given logid

                var db = client.CreateDatabaseQuery().Where(x => x.Id == databaseName).ToList().First();
                var coll = client.CreateDocumentCollectionQuery(db.SelfLink).Where(x => x.Id == collectionName).ToList().First();
                var docs = client.CreateDocumentQuery(coll.SelfLink, queryOptions).Where(x => x.Id == LogID[0]).AsEnumerable().Single();
                var collectionUri = UriFactory.CreateDocumentUri(databaseName, collectionName, docs.ResourceId);
                client.DeleteDocumentAsync(collectionUri);

            }
            catch (Exception) { throw; }
        }

Каждое значение заполнено правильно, и я получаю документ, который мне нужно удалить, но я не могу удалитьЭто? Любая помощь с благодарностью

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

Вы не ожидаете client.DeleteDocumentAsync, что означает, что ваш catch не будет перехватывать исключения, возникающие в созданном Task, - он молча завершится ошибкой.

Мое предположение заключается в том, что из-за этого в DeleteDocumentAsync возникает исключение, которое впоследствии не отлавливается там, где ожидается.

В идеале этот метод будет-писанный для использования async / await, тогда ваш try catch подберет любые генерируемые исключения:

public static async Task DeleteErrorLog(List<string> LogID, string collectionName)
{
    ...
    await client.DeleteDocumentAsync(collectionUri);
    ...
}

Вы должны будете убедиться, что код, вызывающий этот методтакже использует await.

1 голос
/ 31 октября 2019

Возможно, вам не хватает PartitionKey для операции удаления:

var documentUri = UriFactory.CreateDocumentUri(databaseName, collectionName, LogID[0]);
client.DeleteDocumentAsync(documentUri, new RequestOptions(){PartitionKey=new PartitionKey(LogID[0])}).GetAwaiter().GetResult();

Также, если вы уже знаете Id, который в вашем случае равен LogID[0], вам не нужен запрос.

...