Serviços no tempo de design

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

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

Referenciando Microsoft.EntityFrameworkCore.Design

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

Para referenciar seus tipos e substituir serviços de tempo de design, atualize os metadados do item PackageReference no arquivo de projeto.

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

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

Lista de serviços

Veja a seguir uma lista dos serviços de tempo de design.

Serviço Descrição
IAnnotationCodeGenerator Gera o código para anotações de modelo correspondentes.
ICSharpHelper Ajuda na geração de código C#.
IPluralizer Pluraliza e singulariza palavras.
IMigrationsCodeGenerator Gera código para uma migração.
IMigrationsScaffolder A classe principal para gerenciar arquivos de migração.
IDatabaseModelFactory Cria um modelo de banco de dados a partir de um banco de dados.
IModelCodeGenerator Gera código para um modelo.
IProviderConfigurationCodeGenerator Gera código OnConfiguring.
IReverseEngineerScaffolder A classe principal para scaffolding de modelos de engenharia reversa.
IScaffoldingModelFactory Cria um modelo de banco de dados a partir de um modelo de banco de dados.

Usando serviços

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

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