디자인 타임 서비스

도구에서 사용하는 일부 서비스는 디자인 타임에만 사용됩니다. 이러한 서비스는 앱과 함께 배포되지 않도록 EF Core의 런타임 서비스와 별도로 관리됩니다. 이러한 서비스 중 하나(예: 마이그레이션 파일을 생성하는 서비스)를 재정의하려면 IDesignTimeServices의 구현을 시작 프로젝트에 추가합니다.

internal class MyDesignTimeServices : IDesignTimeServices
{
    public void ConfigureDesignTimeServices(IServiceCollection services)
        => services.AddSingleton<IMigrationsCodeGenerator, MyMigrationsCodeGenerator>();
}

Referencing Microsoft.EntityFrameworkCore.Design

Microsoft.EntityFrameworkCore.Design은 DevelopmentDependency 패키지입니다. 따라서 종속성이 다른 프로젝트로 전이되지 않으며 기본적으로 해당 형식을 참조할 수 없습니다.

해당 형식을 참조하고 디자인 타임 서비스를 재정의하려면 프로젝트 파일에서 PackageReference 항목의 메타데이터를 업데이트합니다.

<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.9">
  <PrivateAssets>all</PrivateAssets>
  <!-- Remove IncludeAssets to allow compiling against the assembly -->
  <!--<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>-->
</PackageReference>

패키지가 Microsoft.EntityFrameworkCore.Tools를 통해 전이적으로 참조되는 경우에는 명시적 PackageReference를 패키지에 추가하고 해당 메타데이터를 변경해야 합니다.

서비스 목록

다음은 디자인 타임 서비스의 목록입니다.

서비스 설명
IAnnotationCodeGenerator 해당 모델 주석에 대한 코드를 생성합니다.
ICSharpHelper C# 코드를 생성하는 데 도움이 됩니다.
IPluralizer 단어를 복수화하고 단수화합니다.
IMigrationsCodeGenerator 마이그레이션에 대한 코드를 생성합니다.
IMigrationsScaffolder 마이그레이션 파일을 관리하기 위한 기본 클래스입니다.
IDatabaseModelFactory 데이터베이스에서 데이터베이스 모델을 만듭니다.
IModelCodeGenerator URL에 대한 코드를 생성합니다.
IProviderConfigurationCodeGenerator OnConfiguring 코드를 생성합니다.
IReverseEngineerScaffolder 리버스 엔지니어링 모델을 스캐폴딩하기 위한 기본 클래스입니다.
IScaffoldingModelFactory 데이터베이스 모델에서 모델을 만듭니다.

서비스 사용

이러한 서비스는 사용자 고유의 도구를 만드는 데 유용할 수도 있습니다. 예를 들어 디자인 타임 워크플로의 일부를 자동화하려는 경우입니다.

AddEntityFrameworkDesignTimeServices 및 AddDbContextDesignTimeServices 확장 메서드를 사용하여 이러한 서비스를 포함하는 서비스 공급자를 빌드할 수 있습니다.

var db = new MyDbContext();

// Create design-time services
var serviceCollection = new ServiceCollection();
serviceCollection.AddEntityFrameworkDesignTimeServices();
serviceCollection.AddDbContextDesignTimeServices(db);
var serviceProvider = serviceCollection.BuildServiceProvider();

// Add a migration
var migrationsScaffolder = serviceProvider.GetService<IMigrationsScaffolder>();
var migration = migrationsScaffolder.ScaffoldMigration(migrationName, rootNamespace);
migrationsScaffolder.Save(projectDir, migration, outputDir);