다음을 통해 공유


디자인 타임 서비스

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

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

Microsoft.EntityFrameworkCore.Design 참조

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

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

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

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

서비스 목록

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

서비스 Description
IAnnotationCodeGenerator 해당 모델 주석에 대한 코드를 생성합니다.
ICSharpHelper C# 코드를 생성하는 데 도움이 됩니다.
IPluralizer 단어를 복수화하고 단수화합니다.
ICSharpMigrationOperationGenerator 마이그레이션 작업에 대한 C# 코드를 생성합니다.
ICSharpSnapshotGenerator 모델 스냅샷에 대한 C# 코드를 생성합니다.
IMigrationsCodeGenerator 마이그레이션에 대한 코드를 생성합니다.
IMigrationsCodeGeneratorSelector 적절한 마이그레이션 코드 생성기를 선택합니다.
IMigrationsScaffolder 마이그레이션 파일을 관리하기 위한 기본 클래스입니다.
ICompiledModelCodeGenerator 컴파일된 모델 메타데이터에 대한 코드를 생성합니다.
ICompiledModelCodeGeneratorSelector 적절한 컴파일된 모델 코드 생성기를 선택합니다.
ICompiledModelScaffolder 컴파일된 모델을 스캐폴딩하기 위한 기본 클래스입니다.
IDatabaseModelFactory 데이터베이스에서 데이터베이스 모델을 만듭니다.
IModelCodeGenerator 모델에 대한 코드를 생성합니다.
IModelCodeGeneratorSelector 적절한 모델 코드 생성기를 선택합니다.
IProviderConfigurationCodeGenerator OnConfiguring 코드를 생성합니다.
IReverseEngineerScaffolder 리버스 엔지니어링 모델을 스캐폴딩하기 위한 기본 클래스입니다.
IScaffoldingModelFactory 데이터베이스 모델에서 모델을 만듭니다.
IPrecompiledQueryCodeGenerator 미리 컴파일된 쿼리에 대한 코드를 생성합니다.
IPrecompiledQueryCodeGeneratorSelector 미리 컴파일된 적절한 쿼리 코드 생성기를 선택합니다.

서비스 사용

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

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

using var db = new MyDbContext();

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

var provider = db.GetService<IDatabaseProvider>().Name;
var providerAssembly = Assembly.Load(new AssemblyName(provider));
var providerServicesAttribute = providerAssembly.GetCustomAttribute<DesignTimeProviderServicesAttribute>();
var designTimeServicesType = providerAssembly.GetType(providerServicesAttribute.TypeName, throwOnError: true);
((IDesignTimeServices)Activator.CreateInstance(designTimeServicesType)!).ConfigureDesignTimeServices(serviceCollection);

serviceCollection.AddEntityFrameworkDesignTimeServices();

var serviceProvider = serviceCollection.BuildServiceProvider();

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