Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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);