Servizi in fase di progettazione

Alcuni servizi usati dagli strumenti vengono usati solo in fase di progettazione. Questi servizi vengono gestiti separatamente dai servizi di runtime di EF Core per impedire la distribuzione con l'app. Per eseguire l'override di uno di questi servizi ,ad esempio il servizio per generare i file di migrazione, aggiungere un'implementazione di al progetto di IDesignTimeServices avvio.

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

Riferimento Microsoft.EntityFrameworkCore.Design

Microsoft.EntityFrameworkCore.Design è un pacchetto DevelopmentDependency. Ciò significa che la dipendenza non verrà propagata in modo transitivo in altri progetti e che non è possibile, per impostazione predefinita, fare riferimento ai relativi tipi.

Per fare riferimento ai relativi tipi ed eseguire l'override dei servizi in fase di progettazione, aggiornare i metadati dell'elemento PackageReference nel file di progetto.

<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 il pacchetto viene fatto riferimento transitivamente tramite Microsoft.EntityFrameworkCore.Tools, sarà necessario aggiungere un packageReference esplicito al pacchetto e modificarne i metadati.

Elenco dei servizi

Di seguito è riportato un elenco dei servizi in fase di progettazione.

Servizio Descrizione
IAnnotationCodeGenerator Genera il codice per le annotazioni del modello corrispondenti.
ICSharpHelper Consente di generare codice C#.
IPluralizer Pluralizza e singolarizza le parole.
IMigrationsCodeGenerator Genera codice per una migrazione.
IMigrationsScaffolder Classe principale per la gestione dei file di migrazione.
IDatabaseModelFactory Crea un modello di database da un database.
IModelCodeGenerator Genera il codice per un modello.
IProviderConfigurationCodeGenerator Genera codice OnConfiguring.
IReverseEngineerScaffolder Classe principale per lo scaffolding di modelli inversi.
IScaffoldingModelFactory Crea un modello da un modello di database.

Uso dei servizi

Questi servizi possono essere utili anche per la creazione di strumenti personalizzati. Ad esempio, quando si vuole automatizzare parte del flusso di lavoro in fase di progettazione.

È possibile compilare un provider di servizi contenente questi servizi usando i metodi di estensione 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);