다음을 통해 공유


EF Core Azure Cosmos DB 공급자

Warning

광범위한 작업이 9.0에서 Azure Cosmos DB 공급자로 전환되었습니다. 공급자를 개선하기 위해 많은 영향을 미치는 호환성이 손상되는 변경이 이루어져야 했습니다. 기존 애플리케이션을 업그레이드하는 경우 호환성이 손상되는 변경 섹션을 주의 깊게 읽어 보세요.

이 데이터베이스 공급자를 설치하면 Entity Framework Core를 Azure Cosmos DB에서 사용할 수 있습니다. 공급자는 Entity Framework Core 프로젝트의 일부로 유지 관리됩니다.

이 섹션을 읽기 전에 Azure Cosmos DB 설명서를 숙지하는 것이 좋습니다.

참고

이 공급자는 NoSQL용 Azure Cosmos DB에서만 작동합니다.

설치

Microsoft.EntityFrameworkCore.Cosmos NuGet 패키지를 설치합니다.

dotnet add package Microsoft.EntityFrameworkCore.Cosmos

시작

GitHub에서 이 문서의 샘플을 볼 수 있습니다.

다른 공급자와 마찬가지로, 첫 번째 단계는 UseCosmos를 호출하는 것입니다.

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

경고

여기서는 간단하게 엔드포인트 및 키를 하드 코딩했지만 프로덕션 앱에서는 이들을 안전하게 저장해야 합니다. Azure Cosmos DB에 연결하는 다양한 방법은 연결 및 인증을 참조하세요.

이 예제에서 Order소유된 형식 StreetAddress에 대한 참조를 포함하는 간단한 엔터티입니다.

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; }
}

데이터 저장 및 쿼리는 일반적인 EF 패턴을 따릅니다.

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();
}

중요

필요한 컨테이너를 만들고 모델에 있는 경우 시드 데이터를 삽입하려면 EnsureCreatedAsync를 호출해야 합니다. 그러나 성능 문제가 발생할 수 있으므로 EnsureCreatedAsync는 정상 작업이 아닌 배포 중에만 호출해야 합니다.

Azure Cosmos DB SDK는 Azure Cosmos DB의 관리 평면 작업에 RBAC를 지원하지 않습니다. RBAC를 통한 EnsureCreatedAsync 대신 Azure Management API를 사용합니다.

연결 및 인증

EF Core용 Azure Cosmos DB 공급자에는 UseCosmos 메서드의 여러 오버로드가 있습니다. 이러한 오버로드는 데이터베이스에 연결할 수 있는 다양한 방법과 연결의 보안을 보장하는 다양한 방법을 지원합니다.

Important

UseCosmos 메서드의 각 오버로드 사용에 대한 보안 영향과 모범 사례를 이해하려면 Azure Cosmos DB의 데이터에 대한 보안 액세스를 이해해야 합니다. 일반적으로 토큰 자격 증명이 있는 RBAC는 권장되는 액세스 제어 메커니즘입니다.

연결 메커니즘 UseCosmos 오버로드 자세한 정보
계정 엔드포인트 및 키 UseCosmos<DbContext>(accountEndpoint, accountKey, databaseName) 기본/보조 키
계정 엔드포인트 및 토큰 UseCosmos<DbContext>(accountEndpoint, tokenCredential, databaseName) RBAC 및 리소스 토큰
연결 문자열 UseCosmos<DbContext>(connectionString, databaseName) 계정 키 및 연결 문자열 작업

Azure Cosmos DB 옵션

또한 단일 연결 문자열을 사용하여 Azure Cosmos DB 공급자를 구성하고 연결을 사용자 지정하는 다른 옵션을 지정할 수 있습니다.

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));
        });

위의 코드는 몇 가지 가능한 옵션을 보여 주세요. 이러한 옵션은 동시에 사용할 수 없습니다. 위에서 언급한 각 옵션의 영향에 대한 자세한 내용은 Azure Cosmos DB 옵션 설명서를 참조하세요.