Uygulamanızı Azure Cosmos DB .NET SDK v3 kullanacak şekilde geçirme

Important

Azure Cosmos DB .NET SDK v3 hakkında bilgi edinmek için Sürüm notları, .NET GitHub deposu, .NET SDK v3 Performans İpuçları ve Sorun Giderme kılavuzuna bakın.

Bu makalede, mevcut .NET uygulamanızı NoSQL için API için daha yeni Azure Cosmos DB .NET SDK v3'e yükseltme konusunda dikkat edilmesi gereken bazı noktalar vurgulanmaktadır. Azure Cosmos DB .NET SDK v3, Microsoft.Azure.Azure Cosmos DB ad alanına karşılık gelir. Uygulamanızı aşağıdaki Azure Cosmos DB .NET SDK'larından herhangi birinden geçiriyorsanız bu belgede sağlanan bilgileri kullanabilirsiniz:

  • NoSQL için API için Azure Cosmos DB .NET Framework SDK v2
  • NoSQL için API için Azure Cosmos DB .NET Core SDK v2

Bu makaledeki yönergeler, artık NoSQL için API için Azure Cosmos DB .NET SDK v3'ün parçası olan aşağıdaki dış kitaplıkları geçirmenize de yardımcı olur:

  • .NET değişim akışı işlemci kütüphanesi 2.0
  • .NET toplu yürütücü kitaplığı 1.1 veya üzeri

.NET V3 SDK'daki yenilikler

v3 SDK'sı aşağıdakiler dahil olmak üzere birçok kullanılabilirlik ve performans geliştirmesi içerir:

  • Sezgisel programlama modeli adlandırma
  • .NET Standart 2.0 **
  • Akış API'si desteğiyle artan performans
  • URI fabrikası gereksiniminin yerini alan akıcı hiyerarşi
  • Değişiklik akışı işlemci kitaplığı için yerleşik destek
  • Toplu işlemler için yerleşik destek
  • Daha kolay birim testi için sahte API'ler
  • İşlemsel gruplama ve Blazor desteği
  • Eklenebilir serileştiriciler
  • Bölümlenmemiş ve otomatik ölçeklenen kapsayıcıları ölçeklendirme

SDK, mevcut Azure Cosmos DB .NET Framework ve .NET Core SDK'larını tek bir .NET SDK'sı haline getiren .NET Standard 2.0 hedefler. .NET FRAMEWORK 4.6.1+ ve .NET Core 2.0+ uygulamalarınız da dahil olmak üzere .NET Standard 2.0'ı uygulayan herhangi bir platformda .NET SDK'sını kullanabilirsiniz.

SDK'nın ağ, yeniden deneme mantığı ve alt düzeylerinin çoğu büyük ölçüde değişmeden kalır.

Azure Cosmos DB .NET SDK v3 artık açık kaynaktır. Pull request'leri memnuniyetle karşılıyoruz ve sorunları kaydetmeye ve GitHub'da geri bildirimleri takip etmeye devam edeceğiz. Müşteri deneyimini iyileştirecek özellikler üzerinde çalışacağız.

.NET v3 SDK'sına geçiş neden

Çok sayıda kullanılabilirlik ve performans iyileştirmesine ek olarak, en son SDK'da yapılan yeni özellik yatırımları eski sürümlere geri getirilmeyecektir. v2 SDK'sı şu anda bakım modundadır. En iyi geliştirme deneyimi için her zaman SDK'nın desteklenen en son sürümüyle başlamanızı öneririz.

v2 SDK'dan v3 SDK'ya ana ad değişiklikleri

NoSQL api'sinin API adlandırma kurallarıyla uyumlu hale getirmek için .NET 3.0 SDK'sı genelinde aşağıdaki ad değişiklikleri uygulandı:

  • DocumentClient olarak yeniden adlandırıldı CosmosClient
  • Collection olarak yeniden adlandırıldı Container
  • Document olarak yeniden adlandırıldı Item

Tüm kaynak nesneleri, netlik için kaynak adını içeren ek özelliklerle yeniden adlandırılır.

Ana sınıf adı değişikliklerinden bazıları şunlardır:

.NET v2 SDK .NET v3 SDK
Microsoft.Azure.Documents.Client.DocumentClient Microsoft.Azure.Cosmos.CosmosClient
Microsoft.Azure.Documents.Client.ConnectionPolicy Microsoft.Azure.Cosmos.CosmosClientOptions
Microsoft.Azure.Documents.Client.DocumentClientException Microsoft.Azure.Cosmos.CosmosException
Microsoft.Azure.Documents.Client.Database Microsoft.Azure.Cosmos.DatabaseProperties
Microsoft.Azure.Documents.Client.DocumentCollection Microsoft.Azure.Cosmos.ContainerProperties
Microsoft.Azure.Documents.Client.RequestOptions Microsoft.Azure.Cosmos.ItemRequestOptions
Microsoft.Azure.Documents.Client.FeedOptions Microsoft.Azure.Cosmos.QueryRequestOptions
Microsoft.Azure.Documents.Client.StoredProcedure Microsoft.Azure.Cosmos.StoredProcedureProperties
Microsoft.Azure.Documents.Client.Trigger Microsoft.Azure.Cosmos.TriggerProperties
Microsoft.Azure.Documents.SqlQuerySpec Microsoft.Azure.Cosmos.QueryDefinition

.NET v3 SDK'da değiştirilen sınıflar

Aşağıdaki sınıflar 3.0 SDK'sı üzerinde değiştirilmiştir:

  • Microsoft.Azure.Documents.UriFactory

Microsoft.Azure.Documents.UriFactory sınıfının yerini akıcı tasarım almıştır.

Container container = client.GetContainer(databaseName,containerName);
ItemResponse<SalesOrder> response = await this._container.CreateItemAsync(
        salesOrder,
        new PartitionKey(salesOrder.AccountNumber));

  • Microsoft.Azure.Documents.Document

.NET v3 SDK'sı kullanıcıların özel bir serileştirme altyapısı yapılandırmasına izin verdiğinden, türü için Document doğrudan bir değişiklik yoktur. Newtonsoft.Json (varsayılan serileştirme altyapısı) JObject kullanılırken, aynı işlevselliği elde etmek için kullanılabilir. Farklı bir serileştirme altyapısı kullanırken, temel json belge türünü kullanabilirsiniz (örneğin, JsonDocument System.Text.Json için). Öneri, genel türlere güvenmek yerine öğelerinizin şemasını yansıtan bir C# türü kullanmaktır.

  • Microsoft.Azure.Documents.Resource

Resource için doğrudan bir değiştirme yoktur, belgeler için kullanıldığı durumlarda Document için verilen yönergeleri izleyin.

  • Microsoft.Azure.Documents.AccessCondition

IfNoneMatch veya IfMatch artık doğrudan Microsoft.Azure.Cosmos.ItemRequestOptions üzerinde mevcut.

Öğe kimliği oluşturma değişiklikleri

Öğe kimliği artık .NET v3 SDK'sında otomatik olarak doldurulmaz. Bu nedenle, Öğe Kimliği özel olarak oluşturulan bir kimlik içermelidir. Aşağıdaki örneği görüntüleyin:

[JsonProperty(PropertyName = "id")]
public Guid Id { get; set; }

Bağlantı modu için varsayılan davranış değiştirildi

SDK v3 artık, varsayılan olarak Gateway + HTTPS bağlantı modları olan önceki v2 SDK'sına kıyasla Doğrudan + TCP bağlantı modları olarak ayarlanmıştır. Bu değişiklik gelişmiş performans ve ölçeklenebilirlik sağlar.

FeedOptions'a Yapılan Değişiklikler (v3.0 SDK'sında QueryRequestOptions)

FeedOptions SDK v2'deki sınıfı artık SDK v3'te olarak yeniden adlandırıldı QueryRequestOptions ve sınıfın içinde bazı özelliklerde ad ve/veya varsayılan değerde değişiklikler yapıldı veya tamamen kaldırıldı.

.NET v2 SDK .NET v3 SDK
FeedOptions.MaxDegreeOfParallelism QueryRequestOptions.MaxConcurrency - Varsayılan değer ve ilişkili davranış aynı kalır, paralel sorgu yürütme sırasında istemci tarafı çalıştırılan işlemler paralellik olmadan seri olarak yürütülür.
FeedOptions.PartitionKey QueryRequestOptions.PartitionKey - Davranış korundu.
FeedOptions.EnableCrossPartitionQuery Kaldırıldı. SDK 3.0'daki varsayılan davranış, bölümler arası sorguların özelliği özellikle etkinleştirmeye gerek kalmadan yürütülmesidir.
FeedOptions.PopulateQueryMetrics Kaldırıldı. Artık varsayılan olarak ve tanılamanın bir parçası olarak etkinleştirilir.
FeedOptions.RequestContinuation Kaldırıldı. Artık sorgu yöntemlerine yükseltilir.
FeedOptions.JsonSerializerSettings Kaldırıldı. Daha fazla bilgi için serileştirmeyi özelleştirme bölümüne bakın.
FeedOptions.PartitionKeyRangeId Kaldırıldı. Aynı sonuç, sorgu yöntemine giriş olarak FeedRange kullanılarak elde edilebilir.
FeedOptions.DisableRUPerMinuteUsage Kaldırıldı.

İstemci oluşturma

.NET SDK v3, SDK v2 URI Factory gereksiniminin yerini alan akıcı CosmosClientBuilder bir sınıf sağlar.

Akıcı tasarım, URL'leri dahili olarak oluşturur ve Container, DocumentClient ve DatabaseName yerine tek bir DocumentCollection nesnesinin geçirilmesine izin verir.

Aşağıdaki örnek güçlü bir Tutarlılık Düzeyi ile yeni bir CosmosClientBuilder ve tercih edilen konumlar listesini oluşturur.

CosmosClientBuilder cosmosClientBuilder = new CosmosClientBuilder(
    accountEndpoint: "https://testcosmos.documents.azure.com:443/",
    authKeyOrResourceToken: "SuperSecretKey")
.WithConsistencyLevel(ConsistencyLevel.Strong)
.WithApplicationRegion(Regions.EastUS);
CosmosClient client = cosmosClientBuilder.Build();

Exceptions

v2 SDK, işlemler sırasında hataların sinyalini almak için DocumentClientException'yi kullanırken, v3 SDK is CosmosException'yi, StatusCode, Diagnostics, ve yanıtla ilgili diğer bilgileri sunan öğeyi kullanır. Tüm eksiksiz bilgiler ToString() kullanıldığında seri hale getirilir.

catch (CosmosException ex)
{
    HttpStatusCode statusCode = ex.StatusCode;
    CosmosDiagnostics diagnostics = ex.Diagnostics;
    // store diagnostics optionally with diagnostics.ToString();
    // or log the entire error details with ex.ToString();
}

Tanılama

v2 SDK'sındaki RequestDiagnosticsString özelliği sadece Direct mod tanılamaları sunarken, v3 SDK'sı daha kapsamlı ve Direct modla sınırlı olmayan tanılamaları tüm yanıtlar ve istisnalarda Diagnostics aracılığıyla sunmaktadır. Bunlar yalnızca işlem için SDK'da harcanan zamanı değil, aynı zamanda işlemin iletişim kurduğu bölgeleri de içerir:

try
{
    ItemResponse<MyItem> response = await container.ReadItemAsync<MyItem>(
                    partitionKey: new PartitionKey("MyPartitionKey"),
                    id: "MyId");
    
    TimeSpan elapsedTime = response.Diagnostics.GetElapsedTime();
    if (elapsedTime > somePreDefinedThreshold)
    {
        // log response.Diagnostics.ToString();
        IReadOnlyList<(string region, Uri uri)> regions = response.Diagnostics.GetContactedRegions();
    }
}
catch (CosmosException cosmosException) {
    string diagnostics = cosmosException.Diagnostics.ToString();
    
    TimeSpan elapsedTime = cosmosException.Diagnostics.GetElapsedTime();
    
    IReadOnlyList<(string region, Uri uri)> regions = cosmosException.Diagnostics.GetContactedRegions();
    
    // log cosmosException.ToString()
}

Bağlantı Politikası

Bazı ayarlar ConnectionPolicy içinde yeniden adlandırıldı veya CosmosClientOptions ile değiştirildi.

.NET v2 SDK .NET v3 SDK
EnableEndpointDiscovery LimitToEndpoint - Değer artık tersine çevrildi, eğer EnableEndpointDiscoverytrue olarak ayarlanıyorsa, LimitToEndpointfalse olarak ayarlanmalıdır. Bu ayarı kullanmadan önce istemciyi nasıl etkilediğini anlamanız gerekir.
ConnectionProtocol Kaldırıldı. Protokol, Ağ Geçidi (HTTPS) veya Doğrudan (TCP) olmak üzere Mod'a bağlıdır. HTTPS protokolüne sahip doğrudan mod artık V3 SDK'da desteklenmediğinden TCP protokolü kullanılması önerilir.
MediaRequestTimeout Kaldırıldı. Ekler artık desteklenmiyor.
SetCurrentLocation CosmosClientOptions.ApplicationRegion aynı etkiyi elde etmek için kullanılabilir.
PreferredLocations CosmosClientOptions.ApplicationPreferredRegions aynı etkiyi elde etmek için kullanılabilir.
UserAgentSuffix CosmosClientBuilder.ApplicationName aynı etkiyi elde etmek için kullanılabilir.
UseMultipleWriteLocations Kaldırıldı. SDK, hesabın birden çok yazma uç noktasını desteklediğini otomatik olarak algılar.

Dizin oluşturma ilkesi

Dizin oluşturma ilkesinde bu özellikleri yapılandırmak mümkün değildir. Belirtilmediğinde, bu özellikler artık her zaman aşağıdaki değerlere sahip olacaktır:

Özellik Adı Yeni Değer (yapılandırılamaz)
Kind range
dataType String ve Number

Yolları dahil etme ve dışlama için dizin oluşturma ilkesi örnekleri için bu bölüme bakın. Sorgu altyapısındaki geliştirmeler nedeniyle, eski bir SDK sürümü kullansa bile bu özelliklerin yapılandırılması performansı etkilemez.

Oturum belirteci

v2 SDK, oturum belirtecini yakalamanın gerekli olduğu durumlarda bir yanıtın ResourceResponse.SessionToken olarak oturum belirtecini görünür hale getirirken, çünkü oturum belirteci bir üst bilgidir, v3 SDK bu değeri herhangi bir yanıtın Headers.Session özelliğinde görünür hale getirir.

Timestamp

v2 SDK'de belgenin zaman damgası Timestamp özelliği aracılığıyla sağlanırken, Document artık kullanılamadığı için kullanıcılar _ts modellerindeki bir özelliğe eşleyebilir.

OpenAsync

ile v2 SDK istemcisinin ısıtıldığı kullanım senaryoları için, hem bir v3 SDK istemcisi oluşturmak hem de ısıtmak için kullanılabilir.>

Değişiklik akışı işlemci API'lerini doğrudan v3 SDK'dan kullanma

v3 SDK'sı, Değişiklik Akışı İşlemcisi API'leri için yerleşik desteğe sahiptir ve uygulamanızı oluşturmak ve değişiklik akışı işlemcisi uygulamasını oluşturmak için aynı SDK'yı kullanmanıza olanak sağlar. Daha önce ayrı bir değişiklik akışı işlemci kitaplığı kullanmanız gerekiyordu.

Daha fazla bilgi için bkz. Değişiklik akışı işlemci kitaplığından Azure Cosmos DB .NET v3 SDK'sına geçiş

Akış sorgularını değiştirme

v3 SDK'si üzerinde değişiklik akışı sorguları yürütmek, değişiklik akışı çekme modelinin kullanıldığı kabul edilir. Yapılandırmayı geçirmek için şu tabloyu izleyin:

.NET v2 SDK .NET v3 SDK
ChangeFeedOptions.PartitionKeyRangeId FeedRange - Paralellik elde etmek için değişiklik akışını okumak için FeedRanges kullanılabilir. Artık gerekli bir parametre değildir. Artık kapsayıcının tamamı için Değişiklik Akışını kolayca okuyabilirsiniz .
ChangeFeedOptions.PartitionKey FeedRange.FromPartitionKey - İstenen Bölüm Anahtarını temsil eden bir FeedRange, bu Bölüm Anahtarı değerinin Değişiklik Akışını okumak için kullanılabilir.
ChangeFeedOptions.RequestContinuation ChangeFeedStartFrom.Continuation - Değişiklik akışı yineleyicisi, devam durumu kaydedilerek ve yeni bir yineleyici oluşturulurken kullanılarak herhangi bir zamanda durdurulabilir ve yeniden başlatılabilir.
ChangeFeedOptions.StartTime ChangeFeedStartFrom.Time
ChangeFeedOptions.StartFromBeginning ChangeFeedStartFrom.Beginning
ChangeFeedOptions.MaxItemCount ChangeFeedRequestOptions.PageSizeHint - Değişiklik akışı yineleyicisi, devam durumu kaydedilerek ve yeni bir yineleyici oluşturulurken kullanılarak herhangi bir zamanda durdurulabilir ve yeniden başlatılabilir.
IDocumentQuery.HasMoreResults response.StatusCode == HttpStatusCode.NotModified - Değişiklik akışı kavramsal olarak sonsuzdur, bu nedenle her zaman daha fazla sonuç olabilir. Yanıt durum kodunu içerdiğinde HttpStatusCode.NotModified , şu anda okunacak yeni bir değişiklik olmadığı anlamına gelir. Bunu kullanarak devamlılığı durdurabilir ve kaydedebilir ya da geçici olarak uyku moduna alabilir ya da bekleyip yeniden arayarak ReadNextAsync yeni değişiklikleri test edebilirsiniz.
Bölme yönetimi Kullanıcıların değişiklik akışını okurken bölünmüş özel durumları işlemesi artık gerekli değildir; bölmeler kullanıcı etkileşimi gerekmeden saydam bir şekilde işlenir.

Toplu yürütücü kitaplığını doğrudan V3 SDK'dan kullanma

v3 SDK'sı, toplu yürütücü kitaplığı için yerleşik desteğe sahiptir ve uygulamanızı derlemek ve toplu işlemler gerçekleştirmek için aynı SDK'yı kullanmanıza olanak sağlar. Daha önce ayrı bir toplu çalıştırıcı kütüphanesi kullanmanız gerekiyordu.

Daha fazla bilgi için bkz. Azure Cosmos DB .NET V3 SDK'sında toplu destek için toplu yürütücü kitaplığından geçiş yapma

Serileştirmeyi özelleştirme

.NET V2 SDK'sı, RequestOptions'daJsonSerializerSettings'in sonuç belgesini seri durumdan çıkarmak için kullanılan işlem düzeyinde ayarlanmasına olanak tanır:

// .NET V2 SDK
var result = await container.ReplaceDocumentAsync(document, new RequestOptions { JsonSerializerSettings = customSerializerSettings })

.NET SDK v3, serileştirme altyapısını tamamen özelleştirmek için bir seri hale getirici arabirimi veya istemci yapısının bir parçası olarak daha genel serileştirme seçenekleri sağlar.

İşlem düzeyinde serileştirmeyi özelleştirmek, Stream API'lerinin kullanımıyla elde edilebilir:

// .NET V3 SDK
using(Response response = await this.container.ReplaceItemStreamAsync(stream, "itemId", new PartitionKey("itemPartitionKey"))
{

    using(Stream stream = response.ContentStream)
    {
        using (StreamReader streamReader = new StreamReader(stream))
        {
            // Read the stream and do dynamic deserialization based on type with a custom Serializer
        }
    }
}

Kod parçacığı karşılaştırmaları

Aşağıdaki kod parçacığı, .NET v2 ve v3 SDK'ları arasında kaynakların nasıl oluşturulduğundaki farkları gösterir:

Veritabanı işlemleri

veritabanı oluşturun

// Create database with no shared provisioned throughput
DatabaseResponse databaseResponse = await client.CreateDatabaseIfNotExistsAsync(DatabaseName);
Database database = databaseResponse;
DatabaseProperties databaseProperties = databaseResponse;

// Create a database with a shared manual provisioned throughput
string databaseIdManual = new string(DatabaseName + "_SharedManualThroughput");
database = await client.CreateDatabaseIfNotExistsAsync(databaseIdManual, ThroughputProperties.CreateManualThroughput(400));

// Create a database with shared autoscale provisioned throughput
string databaseIdAutoscale = new string(DatabaseName + "_SharedAutoscaleThroughput");
database = await client.CreateDatabaseIfNotExistsAsync(databaseIdAutoscale, ThroughputProperties.CreateAutoscaleThroughput(4000));

Veritabanını kimliğe göre okuma

// Read a database
Console.WriteLine($"{Environment.NewLine} Read database resource: {DatabaseName}");
database = client.GetDatabase(DatabaseName);
Console.WriteLine($"{Environment.NewLine} database { database.Id.ToString()}");

// Read all databases
string findQueryText = "SELECT * FROM c";
using (FeedIterator<DatabaseProperties> feedIterator = client.GetDatabaseQueryIterator<DatabaseProperties>(findQueryText))
{
    while (feedIterator.HasMoreResults)
    {
        FeedResponse<DatabaseProperties> databaseResponses = await feedIterator.ReadNextAsync();
        foreach (DatabaseProperties _database in databaseResponses)
        {
            Console.WriteLine($"{ Environment.NewLine} database {_database.Id.ToString()}");
        }
    }
}

Veritabanını silme

// Delete a database
await client.GetDatabase(DatabaseName).DeleteAsync();
Console.WriteLine($"{ Environment.NewLine} database {DatabaseName} deleted.");

// Delete all databases in an account
string deleteQueryText = "SELECT * FROM c";
using (FeedIterator<DatabaseProperties> feedIterator = client.GetDatabaseQueryIterator<DatabaseProperties>(deleteQueryText))
{
    while (feedIterator.HasMoreResults)
    {
        FeedResponse<DatabaseProperties> databaseResponses = await feedIterator.ReadNextAsync();
        foreach (DatabaseProperties _database in databaseResponses)
        {
            await client.GetDatabase(_database.Id).DeleteAsync();
            Console.WriteLine($"{ Environment.NewLine} database {_database.Id} deleted");
        }
    }
}

Konteyner işlemleri

Kapsayıcı oluşturma (Otomatik Ölçeklendirme + Süre sonu ile yaşam süresi)

private static async Task CreateManualThroughputContainer(Database database)
{
    // Set throughput to the minimum value of 400 RU/s manually configured throughput
    string containerIdManual = ContainerName + "_Manual";
    ContainerResponse container = await database.CreateContainerIfNotExistsAsync(
        id: containerIdManual,
        partitionKeyPath: partitionKeyPath,
        throughput: 400);
}

// Create container with autoscale
private static async Task CreateAutoscaleThroughputContainer(Database database)
{
    string autoscaleContainerId = ContainerName + "_Autoscale";
    ContainerProperties containerProperties = new ContainerProperties(autoscaleContainerId, partitionKeyPath);

    Container container = await database.CreateContainerIfNotExistsAsync(
        containerProperties: containerProperties,
        throughputProperties: ThroughputProperties.CreateAutoscaleThroughput(autoscaleMaxThroughput: 4000);
}

// Create a container with TTL Expiration
private static async Task CreateContainerWithTtlExpiration(Database database)
{
    string containerIdManualwithTTL = ContainerName + "_ManualTTL";

    ContainerProperties properties = new ContainerProperties
        (id: containerIdManualwithTTL,
        partitionKeyPath: partitionKeyPath);

    properties.DefaultTimeToLive = (int)TimeSpan.FromDays(1).TotalSeconds; //expire in 1 day

    ContainerResponse containerResponse = await database.CreateContainerIfNotExistsAsync(containerProperties: properties);
    ContainerProperties returnedProperties = containerResponse;
}

Kapsayıcı özelliklerini okuma

private static async Task ReadContainerProperties(Database database)
{
    string containerIdManual = ContainerName + "_Manual";
    Container container = database.GetContainer(containerIdManual);
    ContainerProperties containerProperties = await container.ReadContainerAsync();
}

Kapsayıcıyı sil

private static async Task DeleteContainers(Database database)
{
    string containerIdManual = ContainerName + "_Manual";

    // Delete a container
    await database.GetContainer(containerIdManual).DeleteContainerAsync();

    // Delete all CosmosContainer resources for a database
    using (FeedIterator<ContainerProperties> feedIterator = database.GetContainerQueryIterator<ContainerProperties>())
    {
        while (feedIterator.HasMoreResults)
        {
            foreach (ContainerProperties _container in await feedIterator.ReadNextAsync())
            {
                await database.GetContainer(_container.Id).DeleteContainerAsync();
                Console.WriteLine($"{Environment.NewLine}  deleted container {_container.Id}");
            }
        }
    }
}

Öğe ve sorgu işlemleri

Öğe oluşturma

private static async Task CreateItemAsync(Container container)
{
    // Create a SalesOrder POCO object
    SalesOrder salesOrder1 = GetSalesOrderSample("Account1", "SalesOrder1");
    ItemResponse<SalesOrder> response = await container.CreateItemAsync(salesOrder1,
        new PartitionKey(salesOrder1.AccountNumber));
}

private static async Task RunBasicOperationsOnDynamicObjects(Container container)
{
    // Dynamic Object
    dynamic salesOrder = new
    {
        id = "SalesOrder5",
        AccountNumber = "Account1",
        PurchaseOrderNumber = "PO18009186470",
        OrderDate = DateTime.UtcNow,
        Total = 5.95,
    };
    Console.WriteLine("\nCreating item");
    ItemResponse<dynamic> response = await container.CreateItemAsync<dynamic>(
        salesOrder, new PartitionKey(salesOrder.AccountNumber));
    dynamic createdSalesOrder = response.Resource;
}

Kapsayıcıdaki tüm öğeleri okuma

private static async Task ReadAllItems(Container container)
{
    // Read all items in a container
    List<SalesOrder> allSalesForAccount1 = new List<SalesOrder>();

    using (FeedIterator<SalesOrder> resultSet = container.GetItemQueryIterator<SalesOrder>(
        queryDefinition: null,
        requestOptions: new QueryRequestOptions()
        {
            PartitionKey = new PartitionKey("Account1"),
            MaxItemCount = 5
        }))
    {
        while (resultSet.HasMoreResults)
        {
            FeedResponse<SalesOrder> response = await resultSet.ReadNextAsync();
            SalesOrder salesOrder = response.First();
            Console.WriteLine($"\n1.3.1 Account Number: {salesOrder.AccountNumber}; Id: {salesOrder.Id}");
            allSalesForAccount1.AddRange(response);
        }
    }
}

Sorgu öğeleri

SqlQuerySpec'teki değişiklikler (v3.0 SDK'da QueryDefinition)

SqlQuerySpec SDK v2'deki sınıf artık SDK v3'te olarak yeniden adlandırıldıQueryDefinition.

SqlParameterCollection ve SqlParameter kaldırıldı. Parametreler artık QueryDefinition kullanılarak QueryDefinition.WithParameter öğesine bir oluşturucu modeli ile ekleniyor. Kullanıcılar parametrelere erişebilir QueryDefinition.GetQueryParameters

private static async Task QueryItems(Container container)
{
    // Query for items by a property other than Id
    QueryDefinition queryDefinition = new QueryDefinition(
        "select * from sales s where s.AccountNumber = @AccountInput")
        .WithParameter("@AccountInput", "Account1");

    List<SalesOrder> allSalesForAccount1 = new List<SalesOrder>();
    using (FeedIterator<SalesOrder> resultSet = container.GetItemQueryIterator<SalesOrder>(
        queryDefinition,
        requestOptions: new QueryRequestOptions()
        {
            PartitionKey = new PartitionKey("Account1"),
            MaxItemCount = 1
        }))
    {
        while (resultSet.HasMoreResults)
        {
            FeedResponse<SalesOrder> response = await resultSet.ReadNextAsync();
            SalesOrder sale = response.First();
            Console.WriteLine($"\n Account Number: {sale.AccountNumber}; Id: {sale.Id};");
            allSalesForAccount1.AddRange(response);
        }
    }
}

Öğe silme

private static async Task DeleteItemAsync(Container container)
{
    ItemResponse<SalesOrder> response = await container.DeleteItemAsync<SalesOrder>(
        partitionKey: new PartitionKey("Account1"), id: "SalesOrder3");
}

Değişiklik besleme sorgusu

private static async Task QueryChangeFeedAsync(Container container)
{
    FeedIterator<SalesOrder> iterator = container.GetChangeFeedIterator<SalesOrder>(ChangeFeedStartFrom.Beginning(), ChangeFeedMode.Incremental);

    string continuation = null;
    while (iterator.HasMoreResults)
    {
        FeedResponse<SalesOrder> response = await iteratorForTheEntireContainer.ReadNextAsync();
    
        if (response.StatusCode == HttpStatusCode.NotModified)
        {
            // No new changes
            continuation = response.ContinuationToken;
            break;
        }
        else 
        {
            // Process the documents in response
        }
    }
}

Sonraki Adımlar

  • v3 SDK'sını kullanarak NoSQL için Azure Cosmos DB verilerini yönetmek üzere bir Konsol uygulaması oluşturma
  • Azure Cosmos DB'ye geçiş için kapasite planlaması yapmaya mı çalışıyorsunuz?
    • Tek bildiğiniz mevcut veritabanı kümenizdeki sanal çekirdek ve sunucu sayısıysa, sanal çekirdek veya vCPU kullanarak istek birimlerini tahmin etme hakkında bilgi edinin
    • Geçerli veritabanı iş yükünüz için tipik istek oranlarını biliyorsanız, Azure Cosmos DB kapasite planlayıcısını kullanarak istek birimlerini tahmin etme hakkında bilgi edinin.