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