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

ПРИМЕНИМО К: API SQL

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

В рамках этого руководства используется пакет SDK Azure Cosmos DB для .NET версии 3.0 или более поздней версии. Вы можете работать с платформой .NET Framework или .NET Core.

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

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

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

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

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

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

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

  1. From the Azure portal menu or the Home page, select Create a resource.

  2. On the New page, search for and select Azure Cosmos DB.

  3. On the Azure Cosmos DB page, select Create.

  4. In the Create Azure Cosmos DB Account page, enter the basic settings for the new Azure Cosmos account.

    Setting Value Description
    Subscription Subscription name Select the Azure subscription that you want to use for this Azure Cosmos account.
    Resource Group Resource group name Select a resource group, or select Create new, then enter a unique name for the new resource group.
    Account Name A unique name Enter a name to identify your Azure Cosmos account. Because documents.azure.com is appended to the name that you provide to create your URI, use a unique name.

    The name can only contain lowercase letters, numbers, and the hyphen (-) character. It must be between 3-31 characters in length.
    API The type of account to create Select Core (SQL) to create a document database and query by using SQL syntax.

    The API determines the type of account to create. Azure Cosmos DB provides five APIs: Core (SQL) and MongoDB for document data, Gremlin for graph data, Azure Table, and Cassandra. Currently, you must create a separate account for each API.

    Learn more about the SQL API.
    Location The region closest to your users Select a geographic location to host your Azure Cosmos DB account. Use the location that is closest to your users to give them the fastest access to the data.
    Capacity mode Provisioned throughput or Serverless Select Provisioned throughput to create an account in provisioned throughput mode. Select Serverless to create an account in serverless mode.
    Apply Azure Cosmos DB free tier discount Apply or Do not apply With Azure Cosmos DB free tier, you will get the first 1000 RU/s and 25 GB of storage for free in an account. Learn more about free tier.

    Примечание

    You can have up to one free tier Azure Cosmos DB account per Azure subscription and must opt-in when creating the account. If you do not see the option to apply the free tier discount, this means another account in the subscription has already been enabled with free tier.

    The new account page for Azure Cosmos DB

  5. In the Global Distribution tab, configure the following details. You can leave the default values for the purpose of this quickstart:

    Setting Value Description
    Geo-Redundancy Disable Enable or disable global distribution on your account by pairing your region with a pair region. You can add more regions to your account later.
    Multi-region Writes Disable Multi-region writes capability allows you to take advantage of the provisioned throughput for your databases and containers across the globe.

    Примечание

    The following options are not available if you select Serverless as the Capacity mode:

    • Apply Free Tier Discount
    • Geo-redundancy
    • Multi-region Writes
  6. Optionally you can configure additional details in the following tabs:

    • Networking - Configure access from a virtual network.
    • Backup Policy - Configure either periodic or continuous backup policy.
    • Encryption - Use either service-managed key or a customer-managed key.
    • Tags - Tags are name/value pairs that enable you to categorize resources and view consolidated billing by applying the same tag to multiple resources and resource groups.
  7. Select Review + create.

  8. Review the account settings, and then select Create. It takes a few minutes to create the account. Wait for the portal page to display Your deployment is complete.

    The Azure portal Notifications pane

  9. Select Go to resource to go to the Azure Cosmos DB account page.

    The Azure Cosmos DB account page

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

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

  2. В окне Создание проекта выберите Консольное приложение (.NET Framework) для 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 замените <your endpoint URL> значением URI. Замените <your primary key> фактическим значением первичного ключа.

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

    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 de)
        {
            Exception baseException = de.GetBaseException();
            Console.WriteLine("{0} error occurred: {1}", de.StatusCode, de);
        }
        catch (Exception e)
        {
            Console.WriteLine("Error: {0}", e);
        }
        finally
        {
            Console.WriteLine("End of demo, press any key to exit.");
            Console.ReadKey();
        }
    }
    
  7. Нажмите клавишу F5, чтобы запустить приложение.

    В консоли появится такое сообщение: End of demo, press any key to exit. (Демонстрация завершена, нажмите любую клавишу, чтобы выйти). Это сообщение подтверждает, что приложение успешно подключилось к Azure Cosmos DB. Теперь можно закрыть окно консоли.

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

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

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

  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 de)
                {
                    Exception baseException = de.GetBaseException();
                    Console.WriteLine("{0} error occurred: {1}\n", de.StatusCode, de);
                }
                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 из класса CosmosDatabase. Контейнер состоит из элементов (которые в случае 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 из класса CosmosContainer. При использовании 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 и добавьте метод AddItemsToContainerAsync после метода 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);
        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 обновите значения EndPointUri и PrimaryKey, как описано в разделе Шаг 3. Подключение к учетной записи Azure Cosmos DB.

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

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