Condividi tramite


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 IDesignTimeServices al progetto di avvio.

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

Fare riferimento a 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="9.0.0">
  <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 Description
IAnnotationCodeGenerator Genera il codice per le annotazioni del modello corrispondenti.
ICSharpHelper Consente di generare codice C#.
IPluralizer Pluralizza e singolarizza le parole.
ICSharpMigrationOperationGenerator Genera codice C# per le operazioni di migrazione.
ICSharpSnapshotGenerator Genera codice C# per gli snapshot del modello.
IMigrationsCodeGenerator Genera codice per una migrazione.
IMigrationsCodeGeneratorSelector Seleziona il generatore di codice delle migrazioni appropriato.
IMigrationsScaffolder Classe principale per la gestione dei file di migrazione.
ICompiledModelCodeGenerator Genera il codice per i metadati del modello compilati.
ICompiledModelCodeGeneratorSelector Seleziona il generatore di codice del modello compilato appropriato.
ICompiledModelScaffolder Classe principale per il supporto dei modelli compilati.
IDatabaseModelFactory Crea un modello di database da un database.
IModelCodeGenerator Genera il codice per un modello.
IModelCodeGeneratorSelector Seleziona il generatore di codice del modello appropriato.
IProviderConfigurationCodeGenerator Genera codice OnConfiguring.
IReverseEngineerScaffolder Classe principale per lo scaffolding di modelli ingegnerizzati al contrario.
IScaffoldingModelFactory Crea un modello da un modello di database.
IPrecompiledQueryCodeGenerator Genera il codice per le query precompilate.
IPrecompiledQueryCodeGeneratorSelector Seleziona il generatore di codice di query precompilato appropriato.

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.

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