Partilhar via


Serviços em tempo de design

Alguns serviços utilizados pelas ferramentas são usados apenas em tempo de desenvolvimento. Esses serviços são gerenciados separadamente dos serviços de tempo de execução do EF Core para evitar que sejam implantados com seu aplicativo. Para substituir um desses serviços (por exemplo, o serviço para gerar ficheiros de migração), adicione uma implementação de IDesignTimeServices ao seu projeto de inicialização.

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

Referenciando Microsoft.EntityFrameworkCore.Design

Microsoft.EntityFrameworkCore.Design é um pacote DevelopmentDependency. Isso significa que a dependência não fluirá transitivamente para outros projetos e que você não pode, por padrão, fazer referência a seus tipos.

Para fazer referência a seus tipos e substituir serviços de tempo de design, atualize os metadados do item PackageReference em seu arquivo de projeto.

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

Se o pacote estiver sendo referenciado transitivamente via Microsoft.EntityFrameworkCore.Tools, você precisará adicionar um PackageReference explícito ao pacote e alterar seus metadados.

Lista de serviços

A seguir está uma lista dos serviços de tempo de design.

Serviço Description
IAnnotationCodeGenerator Gera o código para as anotações correspondentes do modelo.
ICSharpHelper Ajuda na geração de código C#.
IPluralizer Pluraliza e singulariza palavras.
ICSharpMigrationOperationGenerator Gera código C# para operações de migração.
ICSharpSnapshotGenerator Gera código C# para instantâneos de modelo.
IMigrationsCodeGenerator Gera código para uma migração.
IMigrationsCodeGeneratorSelector Seleciona o gerador de código de migrações apropriado.
IMigrationsScaffolder A classe principal para gerenciar arquivos de migração.
ICompiledModelCodeGenerator Gera código para metadados de modelo compilados.
ICompiledModelCodeGeneratorSelector Seleciona o gerador de código de modelo compilado apropriado.
ICompiledModelScaffolder A principal classe para modelos compilados de andaimes.
IDatabaseModelFactory Cria um modelo de banco de dados a partir de um banco de dados.
IModelCodeGenerator Gera código para um modelo.
IModelCodeGeneratorSelector Seleciona o gerador de código de modelo apropriado.
IProviderConfigurationCodeGenerator Gera código OnConfiguring .
IReverseEngineerScaffolder A principal classe para modelos de engenharia reversa de andaimes.
IScaffoldingModelFactory Cria um modelo a partir de um modelo de banco de dados.
IPrecompiledQueryCodeGenerator Gera código para consultas pré-compiladas.
IPrecompiledQueryCodeGeneratorSelector Seleciona o gerador de código de consulta pré-compilado apropriado.

Utilização de serviços

Esses serviços também podem ser úteis para criar suas próprias ferramentas. Por exemplo, quando deseja automatizar parte do seu fluxo de trabalho de design.

Você pode criar um provedor de serviços contendo esses serviços usando os métodos de extensão AddEntityFrameworkDesignTimeServices e 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);