Руководство по Создание консольного приложения .NET для управления данными в учетной записи API SQL для Azure Cosmos DB

ОБЛАСТЬ ПРИМЕНЕНИЯ: API SQL

Добро пожаловать в руководство по началу работы с API SQL для Azure Cosmos DB. После изучения этого руководства у вас будет консольное приложение, которое создает ресурсы Azure Cosmos DB и отправляет запросы к ним.

В этом руководстве используется версия 3.0 или более поздняя версия для Azure Cosmos DB .NET SDK и .NET 6.

Темы, рассматриваемые в этом руководстве:

  • создание учетной записи Azure Cosmos и подключение к ней;
  • настройка проекта в Visual Studio;
  • создание базы данных и контейнера;
  • добавление элементов в контейнер;
  • выполнение запросов контейнера;
  • создание, чтение, обновление и удаление (CRUD) для элемента;
  • удаление базы данных.

У вас нет времени? Не беспокойтесь! Полное решение доступно на GitHub. Краткие инструкции см. в разделе Получение полного решения для этого руководства.

А теперь приступим к работе!

Предварительные требования

Активная учетная запись Azure. Если у вас ее нет, зарегистрируйте бесплатную учетную запись.

Пробную версию Azure Cosmos DB можно использовать бесплатно, без подписки Azure и без и каких-либо обязательств. Кроме того, вы можете создать учетную запись Azure Cosmos DB категории "Бесплатный". Для этой учетной записи бесплатно предоставляются первые 1000 ЕЗ/с и 25 ГБ пространства в хранилище. Также можно использовать эмулятор Azure Cosmos DB с URI https://localhost:8081. Сведения о ключе для использования с эмулятором см. в этом разделе.

Visual Studio последней версии с рабочей нагрузкой разработки для Azure. Вы можете начать с бесплатного выпускаинтегрированной среды разработки Visual Studio Community. При установке Visual Studio включите рабочую нагрузку разработки для Azure.

Шаг 1. создание учетной записи Azure Cosmos DB;

Давайте создадим учетную запись Azure Cosmos DB. Если у вас уже есть учетная запись, которую вы планируете использовать, пропустите этот раздел. Чтобы применить эмулятор Azure Cosmos DB, его нужно настроить в соответствии с указаниями в статье Использование эмулятора Azure Cosmos для разработки и тестирования в локальной среде. После этого переходите к разделу Шаг 2. Настройка проекта Visual Studio.

  1. На домашней странице или в меню портала Azure выберите Создать ресурс.

  2. На странице Создание найдите и выберите Azure Cosmos DB.

  3. На странице Выберите вариант API в разделе Core (SQL) — рекомендовать нажмите Создать. Azure Cosmos DB предоставляет пять API: Core (SQL) и MongoDB для данных документа, Gremlin для данных графа, таблица Azure и Cassandra. Сейчас для каждого API требуется создавать отдельную учетную запись. Дополнительные сведения об API SQL

  4. На странице создания учетной записи Azure Cosmos DB введите основные параметры для новой учетной записи Azure Cosmos.

    Параметр Значение Описание
    Подписка имя подписки; Выберите подписку Azure, которую нужно использовать для этой учетной записи Azure Cosmos.
    Группа ресурсов Имя группы ресурсов Выберите группу ресурсов или Создать, затем введите уникальное имя для новой группы ресурсов.
    Имя учетной записи Уникальное имя Введите имя для идентификации учетной записи Azure Cosmos. Так как элемент documents.azure.com добавляется к указанному вами имени для создания URI, используйте уникальное имя.

    Имя может содержать только строчные буквы, цифры и знак дефиса (-). Длина — от 3 до 44 знаков.
    Расположение Ближайший к пользователям регион Выберите географическое расположение для размещения учетной записи Azure Cosmos DB. Используйте ближайшее к пользователям расположение, чтобы предоставить им максимально быстрый доступ к данным.
    Режим емкости "Подготовленная пропускная способность" или "Бессерверный" Выберите Подготовленная пропускная способность, чтобы создать учетную запись в режиме подготовленной пропускной способности. Выберите Бессерверный, чтобы создать учетную запись в режиме Бессерверный.
    Применение скидки на основе категории "Бесплатный" для Azure Cosmos DB Применить или не применять В категории "Бесплатный" Azure Cosmos DB для учетной записи бесплатно предоставляются первые 1000 единиц запросов в секунду и 25 ГБ свободного места. Ознакомьтесь с дополнительными сведениями о категории "Бесплатный".

    Примечание

    Вы можете использовать не более одной учетной записи Azure Cosmos DB категории "Бесплатный" на подписку Azure. При создании учетной записи нужно зарегистрироваться. Если параметр подачи заявки на скидку на основе категории "Бесплатный" не отображается, это означает, что в подписке уже включена другая учетная запись категории "Бесплатный".

    Страница Новая учетная запись для Azure Cosmos DB

  5. На вкладке Глобальное распределение настройте следующие сведения. При работе с этим кратким руководством можно оставить значения по умолчанию.

    Параметр Значение Описание
    Геоизбыточность Отключить Включает или отключает глобальное распределение в вашей учетной записи, связывая ваш регион с парным регионом. В дальнейшем в учетную запись можно добавить дополнительные регионы.
    Операции записи с поддержкой нескольких регионов Отключить Поддержка записи в несколько регионов позволяет использовать подготовленную пропускную способность для баз данных и контейнеров по всему миру.

    Примечание

    Следующие параметры недоступны, если вы выбрали значение Бессерверный для параметра Режим емкости:

    • Применение скидки на основе категории "Бесплатный"
    • Геоизбыточность
    • Выполнение операций записи в нескольких регионах
  6. При необходимости можно настроить больше сведений на описанных ниже вкладках:

  7. Выберите Review + create (Просмотреть и создать).

  8. Проверьте параметры учетной записи, а затем нажмите кнопку Создать. Создание учетной записи занимает несколько минут. Дождитесь, пока на странице портала появится сообщение Развертывание выполнено.

    Область Уведомления на портале Azure

  9. Выберите Перейти к ресурсу, чтобы перейти на страницу учетной записи Azure Cosmos DB.

    Страница учетной записи Azure Cosmos DB

Шаг 2. Настройка проекта Visual Studio

  1. Откройте Visual Studio и выберите Создать проект.

  2. В окне Создание проекта выберите Консольное приложение для C# и нажмите кнопку Далее.

  3. Присвойте проекту имя CosmosGettingStartedTutorial и выберите Создать.

  4. В обозревателе решений щелкните правой кнопкой мыши новое консольное приложение (оно находится в решении Visual Studio). Затем щелкните Управление пакетами NuGet.

  5. В окне Диспетчер пакетов NuGet выберите Обзор и найдите Microsoft.Azure.Cosmos. Выберите Microsoft.Azure.Cosmos и щелкните Установить.

    Установка NuGet для клиентского пакета SDK для Azure Cosmos DB

    Идентификатором пакета для клиентской библиотеки API SQL Azure Cosmos DB является Microsoft Azure Cosmos DB Client Library.

Отлично! Теперь, когда мы завершили настройку, начнем писать код. Готовый проект, создаваемый в рамках этого руководства, вы найдете на странице Developing a .NET console app using Azure Cosmos DB (Разработка консольного приложения .NET с помощью Azure Cosmos DB).

Шаг 3. Подключение к учетной записи Azure Cosmos DB

  1. Замените ссылки в начале приложения C# в файле Program.cs на указанные ниже:

    using System;
    using System.Threading.Tasks;
    using System.Configuration;
    using System.Collections.Generic;
    using System.Net;
    using Microsoft.Azure.Cosmos;
    
  2. Добавьте перечисленные ниже константы и переменные в класс Program.

    public class Program
    {
        // ADD THIS PART TO YOUR CODE
    
        // The Azure Cosmos DB endpoint for running this sample.
        private static readonly string EndpointUri = "<your endpoint here>";
        // The primary key for the Azure Cosmos account.
        private static readonly string PrimaryKey = "<your primary key>";
    
        // The Cosmos client instance
        private CosmosClient cosmosClient;
    
        // The database we will create
        private Database database;
    
        // The container we will create.
        private Container container;
    
        // The name of the database and container we will create
        private string databaseId = "FamilyDatabase";
        private string containerId = "FamilyContainer";
    }
    

    Примечание

    Если вы уже знакомы с предыдущей версией пакета SDK для .NET, термины коллекция и документ не будут для вас новыми. Так как Azure Cosmos DB поддерживает несколько моделей API, в версии 3.0+ пакета SDK для .NET используются стандартные термины контейнер и элемент. Контейнер может представлять собой коллекцию, граф или таблицу. Элемент может представлять собой документ, ребро, вершину или запись с некоторым содержимым и размещается внутри контейнера. Дополнительные сведения см. в статье о работе с базами данных, контейнерами и элементами в Azure Cosmos DB.

  3. Откройте портал Azure. Найдите учетную записи Azure Cosmos DB и выберите элемент Ключи.

    Получение ключей Azure Cosmos DB на портале Azure

  4. В файле Program.cs замените значением URI. Замените <your primary key> фактическим значением <your primary key>.

  5. Ниже метода Main добавьте новую асинхронную задачу с именем GetStartedDemoAsync, с помощью которой создается экземпляр .

    public static async Task Main(string[] args)
    {
    }
    
    // ADD THIS PART TO YOUR CODE
    /*
        Entry point to call methods that operate on Azure Cosmos DB resources in this sample
    */
    public async Task GetStartedDemoAsync()
    {
        // Create a new instance of the Cosmos Client
        this.cosmosClient = new CosmosClient(EndpointUri, PrimaryKey);
    }
    

    Мы используем GetStartedDemoAsync в качестве точки входа, которая вызывает методы для работы с ресурсами Azure Cosmos DB.

  6. Добавьте указанный далее код, чтобы запустить асинхронную задачу GetStartedDemoAsync из метода Main. Метод Main будет перехватывать исключения и записывать их в консоль.

    public static async Task Main(string[] args)
    {
        try
        {
            Console.WriteLine("Beginning operations...\n");
            Program p = new Program();
            await p.GetStartedDemoAsync();
    
        }
        catch (CosmosException cosmosException)
        {
            Console.WriteLine("Cosmos Exception with Status {0} : {1}\n", cosmosException.StatusCode, cosmosException);
        }
        catch (Exception e)
        {
            Console.WriteLine("Error: {0}", e);
        }
        finally
        {
            Console.WriteLine("End of demo, press any key to exit.");
            Console.ReadKey();
        }
    }
    
  7. Нажмите клавишу F5, чтобы запустить приложение.

    На консоли отобразится сообщение: Конец демонстрации, нажмите любую клавишу, чтобы выйти. Это сообщение подтверждает подключение приложения к Azure Cosmos DB. Теперь можно закрыть окно консоли.

Поздравляем! Вы успешно подключились к учетной записи Azure Cosmos DB.

Шаг 4. Создание базы данных

База данных представляет собой логический контейнер элементов, разделенных между контейнерами. Базу данных можно создать с помощью метода CreateDatabaseIfNotExistsAsync или CreateDatabaseAsync из класса CreateDatabaseIfNotExistsAsync.

  1. Скопируйте и вставьте метод CreateDatabaseAsync ниже метода GetStartedDemoAsync.

    /// <summary>
    /// Create the database if it does not exist
    /// </summary>
    private async Task CreateDatabaseAsync()
    {
        // Create a new database
        this.database = await this.cosmosClient.CreateDatabaseIfNotExistsAsync(databaseId);
        Console.WriteLine("Created Database: {0}\n", this.database.Id);
    }
    

    Функция CreateDatabaseAsync позволяет создать базу данных с идентификатором FamilyDatabase (если она не была создана ранее), где идентификатор извлекается из поля databaseId. Для этой демонстрации мы создаем базу данных как часть упражнения, но в приложениях в рабочей среде не рекомендуется делать это в рамках обычного процесса.

  2. Скопируйте и вставьте приведенный ниже код для вызова нового метода CreateDatabaseAsync ниже строки, в которой создается экземпляр CosmosClient.

    public async Task GetStartedDemoAsync()
    {
        // Create a new instance of the Cosmos Client
        this.cosmosClient = new CosmosClient(EndpointUri, PrimaryKey);
    
        //ADD THIS PART TO YOUR CODE
        await this.CreateDatabaseAsync();
    }
    

    На этом этапе файл Program.cs должен выглядеть, как показано ниже, но с реальными значениями конечной точки и первичного ключа.

    using System;
    using System.Threading.Tasks;
    using System.Configuration;
    using System.Collections.Generic;
    using System.Net;
    using Microsoft.Azure.Cosmos;
    
    namespace CosmosGettingStartedTutorial
    {
        class Program
        {
            // The Azure Cosmos DB endpoint for running this sample.
            private static readonly string EndpointUri = "<your endpoint here>";
            // The primary key for the Azure Cosmos account.
            private static readonly string PrimaryKey = "<your primary key>";
    
            // The Cosmos client instance
            private CosmosClient cosmosClient;
    
            // The database we will create
            private Database database;
    
            // The container we will create.
            private Container container;
    
            // The name of the database and container we will create
            private string databaseId = "FamilyDatabase";
            private string containerId = "FamilyContainer";
    
            public static async Task Main(string[] args)
            {
                try
                {
                    Console.WriteLine("Beginning operations...");
                    Program p = new Program();
                    await p.GetStartedDemoAsync();
                }
                catch (CosmosException cosmosException)
                {
                    Console.WriteLine("Cosmos Exception with Status {0} : {1}\n", cosmosException.StatusCode, cosmosException);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error: {0}\n", e);
                }
                finally
                {
                    Console.WriteLine("End of demo, press any key to exit.");
                    Console.ReadKey();
                }
            }
    
            /// <summary>
            /// Entry point to call methods that operate on Azure Cosmos DB resources in this sample
            /// </summary>
            public async Task GetStartedDemoAsync()
            {
                // Create a new instance of the Cosmos Client
                this.cosmosClient = new CosmosClient(EndpointUri, PrimaryKey);
                await this.CreateDatabaseAsync();
            }
    
            /// <summary>
            /// Create the database if it does not exist
            /// </summary>
            private async Task CreateDatabaseAsync()
            {
                // Create a new database
                this.database = await this.cosmosClient.CreateDatabaseIfNotExistsAsync(databaseId);
                Console.WriteLine("Created Database: {0}\n", this.database.Id);
            }
        }
    }
    
  3. Нажмите клавишу F5, чтобы запустить приложение.

    Примечание

    Если вы получаете ошибку исключения "503 — служба недоступна", то возможно, что требуемые порты для прямого подключения блокируются брандмауэром. Чтобы устранить эту проблему, откройте необходимые порты или используйте подключение в режиме шлюза, как показано в следующем коде:

      // Create a new instance of the Cosmos Client in Gateway mode
      this.cosmosClient = new CosmosClient(EndpointUri, PrimaryKey, new CosmosClientOptions()
             {
                 ConnectionMode = ConnectionMode.Gateway
             });
    

Поздравляем! Вы успешно создали базу данных Azure Cosmos.

Шаг 5. Создание контейнера

Предупреждение

С помощью метода CreateContainerIfNotExistsAsync создается контейнер. Это влечет за собой необходимость оплаты. Дополнительные сведения см. на нашей странице цен.

Контейнер можно создать с помощью метода CreateContainerIfNotExistsAsync или CreateContainerAsync из класса . Контейнер состоит из элементов (которые в случае API SQL являются документами JSON) и связанной логики приложения JavaScript на стороне сервера, например хранимых процедур, определяемых пользователем функций и триггеров.

  1. Скопируйте и вставьте метод CreateContainerAsync ниже метода CreateDatabaseAsync. Функция CreateContainerAsync позволяет создать контейнер (если он не был создан ранее) с идентификатором FamilyContainer. Для идентификатора используется значение из поля containerId с разделением по свойству LastName. Для этой демонстрации мы создаем контейнер как часть упражнения, но в приложениях в рабочей среде не рекомендуется делать это в рамках обычного процесса.

    /// <summary>
    /// Create the container if it does not exist. 
    /// Specifiy "/LastName" as the partition key since we're storing family information, to ensure good distribution of requests and storage.
    /// </summary>
    /// <returns></returns>
    private async Task CreateContainerAsync()
    {
        // Create a new container
        this.container = await this.database.CreateContainerIfNotExistsAsync(containerId, "/LastName");
        Console.WriteLine("Created Container: {0}\n", this.container.Id);
    }
    
  2. Скопируйте и вставьте приведенный ниже код, где вы создали экземпляр CosmosClient, для вызова добавленного метода CreateContainer.

    public async Task GetStartedDemoAsync()
    {
        // Create a new instance of the Cosmos Client
        this.cosmosClient = new CosmosClient(EndpointUri, PrimaryKey);
        await this.CreateDatabaseAsync();
    
        //ADD THIS PART TO YOUR CODE
        await this.CreateContainerAsync();
    }
    
  3. Нажмите клавишу F5, чтобы запустить приложение.

Поздравляем! Вы успешно создали контейнер Azure Cosmos.

Шаг 6. Добавление элементов в контейнер

Элемент можно создать с помощью метода CreateItemAsync из класса . При использовании API SQL все элементы проецируются как документы с произвольным содержимым JSON, которое определяет пользователь. Теперь можно вставить элемент в ваш контейнер Azure Cosmos.

Сначала создайте класс Family, который представляет объекты, хранящиеся в Azure Cosmos DB для нашего примера. Также создайте подклассы Parent, Child, Pet и Address, которые вызываются из Family. Элемент должен иметь свойство Id, сериализованное как id в файле JSON.

  1. Нажмите сочетание клавиш Ctrl+Shift+A, чтобы открыть окно Добавить новый элемент. Добавьте в ваш проект новый класс Family.cs.

    Снимок экрана: добавление в проект нового класса Family.cs

  2. Скопируйте и вставьте в Family.cs элементы Family, Parent, Child, Pet и класс Address.

    using Newtonsoft.Json;
    
    namespace CosmosGettingStartedTutorial
    {
        public class Family
        {
            [JsonProperty(PropertyName = "id")]
            public string Id { get; set; }
            public string LastName { get; set; }
            public Parent[] Parents { get; set; }
            public Child[] Children { get; set; }
            public Address Address { get; set; }
            public bool IsRegistered { get; set; }
            public override string ToString()
            {
                return JsonConvert.SerializeObject(this);
            }
        }
    
        public class Parent
        {
            public string FamilyName { get; set; }
            public string FirstName { get; set; }
        }
    
        public class Child
        {
            public string FamilyName { get; set; }
            public string FirstName { get; set; }
            public string Gender { get; set; }
            public int Grade { get; set; }
            public Pet[] Pets { get; set; }
        }
    
        public class Pet
        {
            public string GivenName { get; set; }
        }
    
        public class Address
        {
            public string State { get; set; }
            public string County { get; set; }
            public string City { get; set; }
        }
    }
    
  3. Вернитесь к файлу Program.cs и добавьте метод после метода CreateContainerAsync.

    /// <summary>
    /// Add Family items to the container
    /// </summary>
    private async Task AddItemsToContainerAsync()
    {
        // Create a family object for the Andersen family
        Family andersenFamily = new Family
        {
            Id = "Andersen.1",
            LastName = "Andersen",
            Parents = new Parent[]
            {
                new Parent { FirstName = "Thomas" },
                new Parent { FirstName = "Mary Kay" }
            },
            Children = new Child[]
            {
                new Child
                {
                    FirstName = "Henriette Thaulow",
                    Gender = "female",
                    Grade = 5,
                    Pets = new Pet[]
                    {
                        new Pet { GivenName = "Fluffy" }
                    }
                }
            },
            Address = new Address { State = "WA", County = "King", City = "Seattle" },
            IsRegistered = false
        };
    
        try
        {
            // Read the item to see if it exists.  
            ItemResponse<Family> andersenFamilyResponse = await this.container.ReadItemAsync<Family>(andersenFamily.Id, new PartitionKey(andersenFamily.LastName));
            Console.WriteLine("Item in database with id: {0} already exists\n", andersenFamilyResponse.Resource.Id);
        }
        catch(CosmosException ex) when (ex.StatusCode == HttpStatusCode.NotFound)
        {
            // Create an item in the container representing the Andersen family. Note we provide the value of the partition key for this item, which is "Andersen"
            ItemResponse<Family> andersenFamilyResponse = await this.container.CreateItemAsync<Family>(andersenFamily, new PartitionKey(andersenFamily.LastName));
    
            // Note that after creating the item, we can access the body of the item with the Resource property off the ItemResponse. We can also access the RequestCharge property to see the amount of RUs consumed on this request.
            Console.WriteLine("Created item in database with id: {0} Operation consumed {1} RUs.\n", andersenFamilyResponse.Resource.Id, andersenFamilyResponse.RequestCharge);
        }
    
        // Create a family object for the Wakefield family
        Family wakefieldFamily = new Family
        {
            Id = "Wakefield.7",
            LastName = "Wakefield",
            Parents = new Parent[]
            {
                new Parent { FamilyName = "Wakefield", FirstName = "Robin" },
                new Parent { FamilyName = "Miller", FirstName = "Ben" }
            },
            Children = new Child[]
            {
                new Child
                {
                    FamilyName = "Merriam",
                    FirstName = "Jesse",
                    Gender = "female",
                    Grade = 8,
                    Pets = new Pet[]
                    {
                        new Pet { GivenName = "Goofy" },
                        new Pet { GivenName = "Shadow" }
                    }
                },
                new Child
                {
                    FamilyName = "Miller",
                    FirstName = "Lisa",
                    Gender = "female",
                    Grade = 1
                }
            },
            Address = new Address { State = "NY", County = "Manhattan", City = "NY" },
            IsRegistered = true
        };
    
        try
        {
            // Read the item to see if it exists
            ItemResponse<Family> wakefieldFamilyResponse = await this.container.ReadItemAsync<Family>(wakefieldFamily.Id, new PartitionKey(wakefieldFamily.LastName));
            Console.WriteLine("Item in database with id: {0} already exists\n", wakefieldFamilyResponse.Resource.Id);
        }
        catch(CosmosException ex) when (ex.StatusCode == HttpStatusCode.NotFound)
        {
            // Create an item in the container representing the Wakefield family. Note we provide the value of the partition key for this item, which is "Wakefield"
            ItemResponse<Family> wakefieldFamilyResponse = await this.container.CreateItemAsync<Family>(wakefieldFamily, new PartitionKey(wakefieldFamily.LastName));
    
            // Note that after creating the item, we can access the body of the item with the Resource property off the ItemResponse. We can also access the RequestCharge property to see the amount of RUs consumed on this request.
            Console.WriteLine("Created item in database with id: {0} Operation consumed {1} RUs.\n", wakefieldFamilyResponse.Resource.Id, wakefieldFamilyResponse.RequestCharge);
        }
    }
    

    Этот код позволяет проверить, есть ли элемент с таким же идентификатором. Мы вставим два элемента: по одному для семей Андерсен и Вейкфилд.

  4. Добавьте вызов в AddItemsToContainerAsync в метод GetStartedDemoAsync.

    public async Task GetStartedDemoAsync()
    {
        // Create a new instance of the Cosmos Client
        this.cosmosClient = new CosmosClient(EndpointUri, PrimaryKey);
        await this.CreateDatabaseAsync();
        await this.CreateContainerAsync();
    
        //ADD THIS PART TO YOUR CODE
        await this.AddItemsToContainerAsync();
    }
    
  5. Нажмите клавишу F5, чтобы запустить приложение.

Поздравляем! Вы успешно создали два элемента Azure Cosmos.

Шаг 7. Запрашивание ресурсов Azure Cosmos DB

Azure Cosmos DB поддерживает полнофункциональные запросы к документам JSON, хранящимся в каждом контейнере. Дополнительные сведения см. в статье о начале работы с запросами SQL. В следующем примере кода показано, как выполнить запрос к элементам, вставленным на предыдущем шаге.

  1. Скопируйте метод QueryItemsAsync и вставьте его после метода AddItemsToContainerAsync.

    /// <summary>
    /// Run a query (using Azure Cosmos DB SQL syntax) against the container
    /// </summary>
    private async Task QueryItemsAsync()
    {
        var sqlQueryText = "SELECT * FROM c WHERE c.LastName = 'Andersen'";
    
        Console.WriteLine("Running query: {0}\n", sqlQueryText);
    
        QueryDefinition queryDefinition = new QueryDefinition(sqlQueryText);
        using FeedIterator<Family> queryResultSetIterator = this.container.GetItemQueryIterator<Family>(queryDefinition);
    
        List<Family> families = new List<Family>();
    
        while (queryResultSetIterator.HasMoreResults)
        {
            FeedResponse<Family> currentResultSet = await queryResultSetIterator.ReadNextAsync();
            foreach (Family family in currentResultSet)
            {
                families.Add(family);
                Console.WriteLine("\tRead {0}\n", family);
            }
        }
    }
    
  2. Добавьте вызов в QueryItemsAsync в метод GetStartedDemoAsync.

    public async Task GetStartedDemoAsync()
    {
        // Create a new instance of the Cosmos Client
        this.cosmosClient = new CosmosClient(EndpointUri, PrimaryKey);
        await this.CreateDatabaseAsync();
        await this.CreateContainerAsync();
        await this.AddItemsToContainerAsync();
    
        //ADD THIS PART TO YOUR CODE
        await this.QueryItemsAsync();
    }
    
  3. Нажмите клавишу F5, чтобы запустить приложение.

Поздравляем! Вы успешно отправили запрос в контейнер Azure Cosmos.

Шаг 8. Замена элемента JSON

Теперь мы будем обновлять элемент в Azure Cosmos DB. Мы изменим свойство IsRegistered элемента Family и параметр Grade одного из его дочерних элементов.

  1. Скопируйте метод ReplaceFamilyItemAsync и вставьте его после метода QueryItemsAsync.

    /// <summary>
    /// Replace an item in the container
    /// </summary>
    private async Task ReplaceFamilyItemAsync()
    {
        ItemResponse<Family> wakefieldFamilyResponse = await this.container.ReadItemAsync<Family>("Wakefield.7", new PartitionKey("Wakefield"));
        var itemBody = wakefieldFamilyResponse.Resource;
        
        // update registration status from false to true
        itemBody.IsRegistered = true;
        // update grade of child
        itemBody.Children[0].Grade = 6;
    
        // replace the item with the updated content
        wakefieldFamilyResponse = await this.container.ReplaceItemAsync<Family>(itemBody, itemBody.Id, new PartitionKey(itemBody.LastName));
        Console.WriteLine("Updated Family [{0},{1}].\n \tBody is now: {2}\n", itemBody.LastName, itemBody.Id, wakefieldFamilyResponse.Resource);
    }
    
  2. Добавьте вызов в ReplaceFamilyItemAsync в метод GetStartedDemoAsync.

    public async Task GetStartedDemoAsync()
    {
        // Create a new instance of the Cosmos Client
        this.cosmosClient = new CosmosClient(EndpointUri, PrimaryKey);
        await this.CreateDatabaseAsync();
        await this.CreateContainerAsync();
        await this.AddItemsToContainerAsync();
        await this.QueryItemsAsync();
    
        //ADD THIS PART TO YOUR CODE
        await this.ReplaceFamilyItemAsync();
    }
    
  3. Нажмите клавишу F5, чтобы запустить приложение.

Поздравляем! Вы успешно заменили элемент Azure Cosmos.

Шаг 9. Удаление элемента

Теперь мы будем удалять элемент из Azure Cosmos DB.

  1. Скопируйте метод DeleteFamilyItemAsync и вставьте его после метода ReplaceFamilyItemAsync.

    /// <summary>
    /// Delete an item in the container
    /// </summary>
    private async Task DeleteFamilyItemAsync()
    {
        var partitionKeyValue = "Wakefield";
        var familyId = "Wakefield.7";
    
        // Delete an item. Note we must provide the partition key value and id of the item to delete
        ItemResponse<Family> wakefieldFamilyResponse = await this.container.DeleteItemAsync<Family>(familyId,new PartitionKey(partitionKeyValue));
        Console.WriteLine("Deleted Family [{0},{1}]\n", partitionKeyValue, familyId);
    }
    
  2. Добавьте вызов в DeleteFamilyItemAsync в метод GetStartedDemoAsync.

    public async Task GetStartedDemoAsync()
    {
        // Create a new instance of the Cosmos Client
        this.cosmosClient = new CosmosClient(EndpointUri, PrimaryKey);
        await this.CreateDatabaseAsync();
        await this.CreateContainerAsync();
        await this.AddItemsToContainerAsync();
        await this.QueryItemsAsync();
        await this.ReplaceFamilyItemAsync();
    
        //ADD THIS PART TO YOUR CODE
        await this.DeleteFamilyItemAsync();
    }
    
  3. Нажмите клавишу F5, чтобы запустить приложение.

Поздравляем! Вы успешно удалили элемент Azure Cosmos.

Шаг 10. Удаление базы данных

Теперь мы удалим базу данных. При удалении созданной базы данных удаляются и все ее дочерние ресурсы. К таким ресурсам относятся контейнеры, элементы, а также хранимые процедуры, определяемые пользователем функции и триггеры. Мы также избавимся от экземпляра CosmosClient.

  1. Скопируйте метод DeleteDatabaseAndCleanupAsync и вставьте его после метода DeleteFamilyItemAsync.

    /// <summary>
    /// Delete the database and dispose of the Cosmos Client instance
    /// </summary>
    private async Task DeleteDatabaseAndCleanupAsync()
    {
        DatabaseResponse databaseResourceResponse = await this.database.DeleteAsync();
        // Also valid: await this.cosmosClient.Databases["FamilyDatabase"].DeleteAsync();
    
        Console.WriteLine("Deleted Database: {0}\n", this.databaseId);
    
        //Dispose of CosmosClient
        this.cosmosClient.Dispose();
    }
    
  2. Добавьте вызов в DeleteDatabaseAndCleanupAsync в метод GetStartedDemoAsync.

    /// <summary>
    /// Entry point to call methods that operate on Azure Cosmos DB resources in this sample
    /// </summary>
    public async Task GetStartedDemoAsync()
    {
        // Create a new instance of the Cosmos Client
        this.cosmosClient = new CosmosClient(EndpointUri, PrimaryKey);
        await this.CreateDatabaseAsync();
        await this.CreateContainerAsync();
        await this.AddItemsToContainerAsync();
        await this.QueryItemsAsync();
        await this.ReplaceFamilyItemAsync();
        await this.DeleteFamilyItemAsync();
        await this.DeleteDatabaseAndCleanupAsync();
    }
    
  3. Нажмите клавишу F5, чтобы запустить приложение.

Поздравляем! Вы успешно удалили базу данных Azure Cosmos.

Шаг 11. Запуск консольного приложения C#

Чтобы создать приложение в режиме отладки, откройте Visual Studio и нажмите клавишу F5.

В окне консоли должны отобразиться все выходные данные вашего приложения. Эти выходные данные содержат результаты добавленных запросов. Они должны выглядеть так же, как представленный ниже пример текста.

Beginning operations...

Created Database: FamilyDatabase

Created Container: FamilyContainer

Created item in database with id: Andersen.1 Operation consumed 11.43 RUs.

Created item in database with id: Wakefield.7 Operation consumed 14.29 RUs.

Running query: SELECT * FROM c WHERE c.LastName = 'Andersen'

        Read {"id":"Andersen.1","LastName":"Andersen","Parents":[{"FamilyName":null,"FirstName":"Thomas"},{"FamilyName":null,"FirstName":"Mary Kay"}],"Children":[{"FamilyName":null,"FirstName":"Henriette Thaulow","Gender":"female","Grade":5,"Pets":[{"GivenName":"Fluffy"}]}],"Address":{"State":"WA","County":"King","City":"Seattle"},"IsRegistered":false}

Updated Family [Wakefield,Wakefield.7].
        Body is now: {"id":"Wakefield.7","LastName":"Wakefield","Parents":[{"FamilyName":"Wakefield","FirstName":"Robin"},{"FamilyName":"Miller","FirstName":"Ben"}],"Children":[{"FamilyName":"Merriam","FirstName":"Jesse","Gender":"female","Grade":6,"Pets":[{"GivenName":"Goofy"},{"GivenName":"Shadow"}]},{"FamilyName":"Miller","FirstName":"Lisa","Gender":"female","Grade":1,"Pets":null}],"Address":{"State":"NY","County":"Manhattan","City":"NY"},"IsRegistered":true}

Deleted Family [Wakefield,Wakefield.7]

Deleted Database: FamilyDatabase

End of demo, press any key to exit.

Поздравляем! Вы завершили работу с этим руководством, и теперь у вас есть работающее консольное приложение C#.

Получение готового решения для этого руководства

Если у вас нет времени на выполнение шагов из этого руководства или вы хотите просто скачать примеры кода, вы можете это сделать.

Для создания решения GetStarted вам потребуются указанные ниже компоненты.

Чтобы в Visual Studio восстановить ссылки на пакет SDK .NET для Azure Cosmos DB, в обозревателе решений щелкните правой кнопкой мыши решение, а затем щелкните Восстановить пакеты NuGet. Затем в файле App.config обновите значения и PrimaryKey согласно инструкциям в разделе PrimaryKey.

Теперь все готово. Выполните сборку и начинайте работу с решением.

Дальнейшие действия