EF Core Azure Cosmos DB Sağlayıcısı

Warning

9.0'da Azure Cosmos DB sağlayıcısı üzerinde kapsamlı çalışmalar yapıldı. Sağlayıcıyı geliştirmek için bir dizi büyük etki yaratan önemli değişikliklerin yapılması gerekmiş olabilir; mevcut bir uygulamayı yükseltiyorsanız, lütfen önemli değişiklikler bölümünü dikkatle okuyun.

Bu veritabanı sağlayıcısı Entity Framework Core'un Azure Cosmos DB ile birlikte kullanılmasına izin verir. Sağlayıcı Entity Framework Core Projesi kapsamında tutulur.

Bu bölümü okumadan önce Azure Cosmos DB belgeleri hakkında bilgi sahibi olmanız kesinlikle önerilir.

Note

Bu sağlayıcı yalnızca NoSQL için Azure Cosmos DB ile çalışır.

Install

Microsoft.EntityFrameworkCore.Cosmos NuGet paketini yükleyin.

dotnet add package Microsoft.EntityFrameworkCore.Cosmos

Get started

Tip

Bu makalenin örneğini GitHub'da görüntüleyebilirsiniz.

Diğer sağlayıcılar için atılacak ilk adım UseCosmos'u çağırmaktır:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.UseCosmos(
        "https://localhost:8081",
        "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==",
        databaseName: "OrdersDB");

Warning

Uç nokta ve anahtar basitlik için burada sabit kodlanmıştır, ancak bir üretim uygulamasında bunlar güvenli bir şekilde depolanmalıdır. Azure Cosmos DB'ye bağlanmanın farklı yolları için bkz . Bağlanma ve kimlik doğrulaması .

Bu örnekte Order, sahip olunan türStreetAddress ile bir referansa sahip basit bir varlıktır.

public class Order
{
    public int Id { get; set; }
    public int? TrackingNumber { get; set; }
    public string PartitionKey { get; set; }
    public StreetAddress ShippingAddress { get; set; }
}
public class StreetAddress
{
    public string Street { get; set; }
    public string City { get; set; }
}

Verileri kaydetme ve sorgulama normal EF desenini izler:

using (var context = new OrderContext())
{
    await context.Database.EnsureDeletedAsync();
    await context.Database.EnsureCreatedAsync();

    context.Add(
        new Order
        {
            Id = 1, ShippingAddress = new StreetAddress { City = "London", Street = "221 B Baker St" }, PartitionKey = "1"
        });

    await context.SaveChangesAsync();
}

using (var context = new OrderContext())
{
    var order = await context.Orders.FirstAsync();
    Console.WriteLine($"First order will ship to: {order.ShippingAddress.Street}, {order.ShippingAddress.City}");
    Console.WriteLine();
}

Important

Gerekli kapsayıcıları oluşturmak ve modelde varsa tohum verilerini eklemek için EnsureCreatedAsync çağrısı yapılması gerekir. Ancak EnsureCreatedAsync, performans sorunlarına neden olabileceği için yalnızca dağıtım sırasında çağrılmalı, normal işlem sırasında çağrılmamalıdır.

Azure Cosmos DB SDK'sı, Azure Cosmos DB'deki yönetim düzlemi işlemleri için RBAC'i desteklemez. RBAC ile EnsureCreatedAsync yerine Azure Management API'sini kullanın.

Bağlanma ve kimlik doğrulaması

EF Core için Azure Cosmos DB sağlayıcısında UseCosmos yönteminin birden çok aşırı yüklemesi vardır. Bu aşırı yüklemeler, veritabanına bağlantı oluşturmanın farklı yollarını ve bağlantının güvenli olmasını sağlamanın farklı yollarını destekler.

Important

Azure Cosmos DB'deki verilere güvenli erişimi anlamanız ve bu sayede her bir UseCosmos yöntem aşırı yüklemesini kullanırken güvenlik etkileri ile en iyi uygulamaları kavramanız önemlidir. Genellikle, anahtar kimlik bilgilerine sahip RBAC, önerilen erişim kontrol mekanizmasıdır.

Bağlantı Mekanizması UseCosmos Aşırı Yükleme Daha Fazla Bilgi
Hesap uç noktası ve anahtarı UseCosmos<DbContext>(accountEndpoint, accountKey, databaseName) Birincil/ikincil anahtarlar
Hesap uç noktası ve belirteç UseCosmos<DbContext>(accountEndpoint, tokenCredential, databaseName) RBAC ve Kaynak belirteçleri
Bağlantı dizesi UseCosmos<DbContext>(connectionString, databaseName) Hesap anahtarları ve bağlantı dizesi ile çalışma

Azure Cosmos DB seçenekleri

Azure Cosmos DB sağlayıcısını tek bir bağlantı dizesi ile yapılandırmak ve bağlantıyı özelleştirmek için diğer seçenekleri belirtmek de mümkündür:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.UseCosmos(
        "AccountEndpoint=https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==",
        databaseName: "OptionsDB",
        options =>
        {
            options.ConnectionMode(ConnectionMode.Gateway);
            options.WebProxy(new WebProxy());
            options.LimitToEndpoint();
            options.Region(Regions.AustraliaCentral);
            options.GatewayModeMaxConnectionLimit(32);
            options.MaxRequestsPerTcpConnection(8);
            options.MaxTcpConnectionsPerEndpoint(16);
            options.IdleTcpConnectionTimeout(TimeSpan.FromMinutes(1));
            options.OpenTcpConnectionTimeout(TimeSpan.FromMinutes(1));
            options.RequestTimeout(TimeSpan.FromMinutes(1));
        });

Yukarıdaki kod bazı olası seçenekleri gösterir; bunlar aynı anda kullanılmak üzere tasarlanmamıştır. Yukarıda bahsedilen her seçeneğin etkisinin ayrıntılı açıklaması için Azure Cosmos DB Seçenekleri belgelerine bakın.