다음을 통해 공유


.NET Aspire Pomelo MySQLEntity Framework Core 통합

포함:호스팅 통합 포함 호스팅 통합 -&— Client 통합 포함Client 통합

MySQL SQL(구조적 쿼리 언어)을 사용하여 데이터를 관리하고 조작하는 오픈 소스 RDBMS(관계형 데이터베이스 관리 시스템)입니다. 소규모 프로젝트에서 대규모 엔터프라이즈 시스템에 이르기까지 다양한 환경에서 사용되며 클라우드 네이티브 애플리케이션에서 마이크로 서비스를 뒷받침하는 데이터를 호스트하는 것이 좋습니다. .NET Aspire Pomelo MySQLEntity Framework Core 통합을 사용하면 기존 MySQL 데이터베이스에 연결하거나 .NET사용하여 mysql 새 인스턴스를 만들 수 있습니다.

호스팅 통합

MySQL 호스팅 통합은 서버를 MySqlServerResource 형식으로, 데이터베이스를 MySqlDatabaseResource 형식으로 모델화합니다. 이러한 형식 및 API에 액세스하려면 앱 호스트 프로젝트에 .Hosting.MySql NuGet 패키지를 추가합니다.

dotnet add package Aspire.Hosting.MySql

자세한 내용은 dotnet add package 또는 Manage package dependencies in applications(애플리케이션에서 .NET 패키지 추가 또는 패키지 종속성 관리)를 참조하세요.

MySQL 서버 리소스 및 데이터베이스 리소스 추가

앱 호스트 프로젝트에서 AddMySql을 호출하여 MySQL 리소스 생성기를 추가하고 반환합니다. 반환된 리소스 작성기에 연속적으로 호출을 연결하여 AddDatabase에 MySQL 데이터베이스 리소스를 추가합니다.

var builder = DistributedApplication.CreateBuilder(args);

var mysql = builder.AddMySql("mysql")
                   .WithLifetime(ContainerLifetime.Persistent);

var mysqldb = mysql.AddDatabase("mysqldb");

var myService = builder.AddProject<Projects.ExampleProject>()
                       .WithReference(mysqldb)
                       .WaitFor(mysqldb);

// After adding all resources, run the app...

메모

컨테이너는 SQL Server 시작 속도가 느리므로 불필요한 다시 시작을 방지하기 위해 영구 수명을 사용하는 것이 가장 좋습니다. 자세한 내용은 컨테이너 리소스 수명을 참조하세요.

.NET .NET Aspire mysql 이미지와 함께 이전 예제와 같이 앱 호스트에 컨테이너 이미지를 추가하면 로컬 컴퓨터에 새 MySQL 인스턴스가 만들어집니다. MySQL 리소스 작성기(mysql 변수)에 대한 참조는 데이터베이스를 추가하는 데 사용됩니다. 데이터베이스는 mysqldb으로 명명된 후 ExampleProject에 추가됩니다. MySQL 리소스에는 usernameroot를 포함한 기본 자격 증명과 password 메서드를 사용하여 생성된 임의의 CreateDefaultPasswordParameter이 포함됩니다.

앱 호스트가 실행되면 암호가 앱 호스트의 비밀 저장소에 저장됩니다. 예를 들어 Parameters 섹션에 추가된 것입니다.

{
  "Parameters:mysql-password": "<THE_GENERATED_PASSWORD>"
}

매개 변수의 이름은 mysql-password, 실제로는 리소스 이름에 -password 접미사를 사용하여 서식을 지정하는 것입니다. 자세한 내용은 에서 개발 시 앱 비밀의 안전한 저장을 참조하세요. 또한, 매개변수를 사용하여 리소스를 추가하는 방법을 참조하세요.

WithReference 메서드는 ExampleProject라는 이름의 mysqldb에서 연결을 구성합니다.

기존 MySQL 서버에 연결하려는 경우 대신 AddConnectionString 호출합니다. 자세한 내용은 기존 리소스를 참조하세요 .

데이터 볼륨을 사용하여 MySQL 리소스 추가

SQL Server 리소스에 데이터 볼륨을 추가하려면 WithDataVolume 리소스에서 SQL Server 메서드를 호출합니다.

var builder = DistributedApplication.CreateBuilder(args);

var mysql = builder.AddMySql("mysql")
                   .WithDataVolume();

var mysqldb = mysql.AddDatabase("mysqldb");

builder.AddProject<Projects.ExampleProject>()
       .WithReference(mysqldb)
       .WaitFor(mysqldb);

// After adding all resources, run the app...

데이터 볼륨은 컨테이너의 수명 주기 외부에 MySQL 서버 데이터를 유지하는 데 사용됩니다. 데이터 볼륨은 /var/lib/mysql 컨테이너의 SQL Server 경로에 탑재되고 name 매개 변수가 제공되지 않으면 이름이 임의로 생성됩니다. 데이터 볼륨에 대한 추가 정보 및바인드 마운트보다 선호되는 이유에 대한 자세한 내용은 문서: 볼륨를 확인하십시오.

경고

암호는 데이터 볼륨에 저장됩니다. 데이터 볼륨을 사용하는 경우 암호가 변경되면 볼륨을 삭제할 때까지 작동하지 않습니다.

중요하다

일부 데이터베이스 통합, 예를 들어 .NET AspireMySQL 통합은 배포 후 Azure Container Apps(ACA)에서 데이터 볼륨을 성공적으로 사용할 수 없습니다. ACA는 SMB(메시지 블록)를 사용하여 Server 컨테이너를 데이터 볼륨에 연결하고 일부 시스템에서는 이 연결을 사용할 수 없기 때문입니다. Aspire 대시보드에서 이 문제의 영향을 받는 데이터베이스는 활성화 또는 정품 인증 실패 상태이지만 실행 중으로 나열되지 않습니다.

Kubernetes 클러스터에 배포하여 문제를 해결할 수 있으며, 예를 들어 AzureKubernetes 서비스(AKS)가 있습니다. 자세한 내용은 .NET.NET Aspire 배포를 참조하세요.

데이터 바인드 마운트를 사용하여 MySQL 리소스를 추가하세요.

MySQL 리소스에 데이터 바인딩 탑재를 추가하려면 WithDataBindMount 메서드를 호출합니다.

var builder = DistributedApplication.CreateBuilder(args);

var mysql = builder.AddMySql("mysql")
                   .WithDataBindMount(source: @"C:\MySql\Data");

var db = sql.AddDatabase("mysqldb");

builder.AddProject<Projects.ExampleProject>()
       .WithReference(mysqldb)
       .WaitFor(mysqldb);

// After adding all resources, run the app...

중요하다

데이터 바인딩 탑재볼륨에 비해 기능이 제한되어 성능, 이식성 및 보안을 향상시켜 프로덕션 환경에 더 적합합니다. 그러나 바인딩 탑재를 사용하면 호스트 시스템의 파일에 직접 액세스하고 수정할 수 있으므로 실시간 변경이 필요한 개발 및 테스트에 적합합니다.

데이터 바인드 마운트는 호스트 머신의 파일 시스템을 사용하여 컨테이너 재시작 시에도 MySQL 데이터를 지속적으로 유지합니다. 데이터 바인딩 탑재는 C:\MySql\Data 컨테이너의 호스트 컴퓨터에서 Windows의 /MySql/Data(또는 Unix경로의 MySQL)에 탑재됩니다. 데이터 바인드 마운트에 대한 자세한 내용은 문서를 참조하세요: 바인드 마운트Docker.

매개 변수를 사용하여 MySQL 리소스 추가

루트 MySQL 암호를 명시적으로 제공하려는 경우 매개 변수로 전달할 수 있습니다. 다음 대체 예제를 고려합니다.

var password = builder.AddParameter("password", secret: true);

var mysql = builder.AddMySql("mysql", password)
                   .WithLifetime(ContainerLifetime.Persistent);

var mysqldb = mysql.AddDatabase("mysqldb");

var myService = builder.AddProject<Projects.ExampleProject>()
                       .WithReference(mysqldb)
                       .WaitFor(mysqldb);

자세한 내용은외부 매개 변수를 참조하세요.

PhpMyAdmin 리소스 추가

phpMyAdmin 은 인기 있는 웹 기반 관리 도구입니다 MySQL. 데이터베이스, 테이블, 뷰 및 인덱스와 같은 MySQL 개체를 찾아 수정하는 데 사용할 수 있습니다. .NET .NET Aspire 솔루션 내에서 phpMyAdmin을 사용하려면 WithPhpMyAdmin 메서드를 호출합니다. 이 메서드는 phpMyAdmin을 호스트하고 MySQL 컨테이너에 연결하는 솔루션에 새 컨테이너 리소스를 추가합니다.

var builder = DistributedApplication.CreateBuilder(args);

var mysql = builder.AddMySql("mysql")
                   .WithPhpMyAdmin();

var db = sql.AddDatabase("mysqldb");

builder.AddProject<Projects.ExampleProject>()
       .WithReference(mysqldb)
       .WaitFor(mysqldb);

// After adding all resources, run the app...

솔루션을 실행하면 .NET.NET Aspire 대시보드에 엔드포인트가 있는 phpMyAdmin 리소스가 표시됩니다. 엔드포인트에 대한 링크를 선택하여 새 브라우저 탭에서 phpMyAdmin을 봅니다.

통합 기능 상태 관리

MySQL 호스팅 통합은 MySQL 리소스에 대한 상태 검사를 자동으로 추가합니다. 상태 검사는 MySQL 서버가 실행 중이며 서버에 대한 연결을 설정할 수 있는지 확인합니다.

호스팅 통합은 AspNetCore.HealthChecks.MySql NuGet 패키지에📦 의존합니다.

Client 통합

.NET Aspire Pomelo MySQL Entity Framework 통합을 시작하려면, 해당 클라이언트를 사용하는 애플리케이션의 프로젝트, 즉 📦Aspire 클라이언트를 사용하는 애플리케이션의 프로젝트에 NuGet 패키지를 설치합니다.

dotnet add package Aspire.Pomelo.EntityFrameworkCore.MySql

자세한 내용은 dotnet add package 또는 Manage package dependencies in applications(애플리케이션에서 .NET 패키지 추가 또는 패키지 종속성 관리)를 참조하세요.

MySQL 데이터베이스 컨텍스트 추가

클라이언트 사용 프로젝트의 Program.cs 파일에서, 종속성 주입 컨테이너를 통해 사용할 AddMySqlDbContext를 등록하기 위해 모든 IHostApplicationBuilder에서 DbContext 확장 메서드를 호출하세요. 메서드는 연결 이름 매개 변수를 사용합니다.

builder.AddMySqlDbContext<ExampleDbContext>(connectionName: "mysqldb");

connectionName 매개 변수는 앱 호스트 프로젝트에 SQL Server 데이터베이스 리소스를 추가할 때 사용되는 이름과 일치해야 합니다. AddDatabase을 호출하고 mysqldb의 이름을 제공할 때, AddMySqlDbContext를 호출할 때 동일한 이름을 사용해야 합니다. 자세한 내용은 서버 리소스 및 데이터베이스 리소스 추가MySQL를 참조하세요.

서비스에서 ExampleDbContext 개체를 검색하려면 다음을 수행합니다.

public class ExampleService(ExampleDbContext context)
{
    // Use context...
}

종속성 주입에 대한 자세한 내용은 종속성 주입을 참조.NET하세요.

MySQL 데이터베이스 컨텍스트 보강

표준 Entity Framework 메서드를 사용하여 데이터베이스 컨텍스트를 가져오고 종속성 주입 컨테이너에 추가하는 것이 좋습니다.

builder.Services.AddDbContext<ExampleDbContext>(options =>
    options.UseMySql(builder.Configuration.GetConnectionString("mysqldb")
        ?? throw new InvalidOperationException("Connection string 'mysqldb' not found.")));

메모

GetConnectionString 메서드에 전달하는 연결 문자열 이름은 앱 호스트 프로젝트에서 MySQL 리소스를 추가할 때 사용되는 이름과 일치해야 합니다. 자세한 내용은 서버 리소스 및 데이터베이스 리소스 추가MySQL를 참조하세요.

이러한 방식으로 데이터베이스 컨텍스트를 만들 때 유연성이 더 높습니다. 예를 들면 다음과 같습니다.

  • .NET .NET Aspire위해 다시 작성하지 않고 데이터베이스 컨텍스트에 기존 구성 코드를 다시 사용할 수 있습니다.
  • Entity Framework Core 인터셉터를 사용하여 데이터베이스 작업을 수정할 수 있습니다.
  • 상황에 따라 더 나은 성능을 발휘할 수 있는 Entity Framework Core 컨텍스트 풀링을 사용하지 않도록 선택할 수 있습니다.

이 메서드를 사용하는 경우 .NET 메서드를 호출하여 .NET AspireEnrichMySqlDbContext스타일 재시도, 상태 검사, 로깅 및 원격 분석 기능을 사용하여 데이터베이스 컨텍스트를 향상시킬 수 있습니다.

builder.EnrichMySqlDbContext<ExampleDbContext>(
    configureSettings: settings =>
    {
        settings.DisableRetry = false;
        settings.CommandTimeout = 30 // seconds
    });

settings 매개 변수는 PomeloEntityFrameworkCoreMySqlSettings 클래스의 인스턴스입니다.

구성

.NET Aspire Pomelo MySQLEntity Framework Core 통합은 프로젝트의 요구 사항 및 규칙에 따라 데이터베이스 연결을 구성하는 여러 옵션을 제공합니다.

연결 문자열 사용

ConnectionStrings 구성 섹션에서 연결 문자열을 사용하는 경우 builder.AddMySqlDatabaseDbContext<TContext>()호출할 때 연결 문자열의 이름을 제공할 수 있습니다.

builder.AddMySqlDatabaseDbContext<MyDbContext>("mysql");

그런 다음 ConnectionStrings 구성 섹션에서 연결 문자열을 검색합니다.

{
  "ConnectionStrings": {
    "mysql": "Server=mysql;Database=mysqldb"
  }
}

EnrichMySqlDbContext는 호출 시점에 ConnectionStrings가 등록되어 있을 것으로 예상하기 때문에 DbContext 구성 섹션을 사용하지 않습니다.

자세한 내용은 MySqlConnector: ConnectionString 설명서를 참조하세요.

구성 공급자 사용

.NET Aspire Pomelo MySQLEntity Framework Core 통합은 Microsoft.Extensions.Configuration지원합니다. PomeloEntityFrameworkCoreMySqlSettings 키를 사용하여 appsettings.json 같은 구성 파일에서 Aspire:Pomelo:EntityFrameworkCore:MySql 로드합니다.

다음 예에서는 appsettings.json가 사용 가능한 옵션 중 일부를 어떻게 구성하는지 설명합니다.

{
  "Aspire": {
    "Pomelo": {
      "EntityFrameworkCore": {
        "MySql": {
          "ConnectionString": "YOUR_CONNECTIONSTRING",
          "DisableHealthChecks": true,
          "DisableTracing": true
        }
      }
    }
  }
}

전체 MySQL 통합 JSON 스키마는 다음을 참조하세요 Aspire. Pomelo.EntityFrameworkCore.MySql/ConfigurationSchema.json.

인라인 대리자 사용

Action<PomeloEntityFrameworkCoreMySqlSettings> 델리게이트를 전달하여, 예를 들어 코드에서 상태 검사를 비활성화하는 등 일부 또는 모든 옵션을 인라인으로 설정할 수도 있습니다.

builder.AddMySqlDbContext<MyDbContext>(
    "mysqldb",
    static settings => settings.DisableHealthChecks = true);

또는

builder.EnrichMySqlDbContext<MyDbContext>(
    static settings => settings.DisableHealthChecks = true);

Client 통합 시스템 상태 점검

기본적으로 .NET.NET Aspire클라이언트 통합 은 모든 서비스에 대해 상태 검사를 사용하도록 설정됩니다. 마찬가지로, 많은 .NET.NET Aspire호스팅 통합을 통해 상태 검사 엔드포인트도 사용할 수 있습니다. 자세한 내용은 다음을 참조하세요.

.NET Aspire Pomelo MySQLEntity Framework Core 통합:

관찰 가능성 및 원격 분석

통합은 로깅, 트레이싱, 메트릭스 구성을 자동으로 설정하며, 이는 때때로 관찰성의 핵심 요소로 알려져 있습니다. 통합 관찰 가능성 및 원격 분석에 대한 자세한 내용은 통합 개요를 참조.NET.NET Aspire하세요. 지원 서비스에 따라 일부 통합은 이러한 기능 중 일부만 지원할 수 있습니다. 예를 들어 일부 통합은 로깅 및 추적을 지원하지만 메트릭은 지원하지 않습니다. 구성 섹션에 제공된 기술을 사용하여 원격 분석 기능을 사용하지 않도록 설정할 수도 있습니다.

로깅

.NET Aspire Pomelo MySQLEntity Framework Core 통합은 다음 로그 범주를 사용합니다.

  • Microsoft.EntityFrameworkCore.ChangeTracking
  • Microsoft.EntityFrameworkCore.Database.Command
  • Microsoft.EntityFrameworkCore.Database.Connection
  • Microsoft.EntityFrameworkCore.Database.Transaction
  • Microsoft.EntityFrameworkCore.Infrastructure
  • Microsoft.EntityFrameworkCore.Migrations
  • Microsoft.EntityFrameworkCore.Model
  • Microsoft.EntityFrameworkCore.Model.Validation
  • Microsoft.EntityFrameworkCore.Query
  • Microsoft.EntityFrameworkCore.Update

추적

.NET Aspire Pomelo MySQLEntity Framework Core 통합은 OpenTelemetry를 사용하여 다음 추적 활동을 발생시킬 것입니다.

  • MySqlConnector

메트릭

.NET Aspire Pomelo MySQLEntity Framework Core 통합은 현재 다음 메트릭을 지원합니다.

  • MySqlConnector:
    • db.client.connections.create_time
    • db.client.connections.use_time
    • db.client.connections.wait_time
    • db.client.connections.idle.max
    • db.client.connections.idle.min
    • db.client.connections.max
    • db.client.connections.pending_requests
    • db.client.connections.timeouts
    • db.client.connections.usage

참고