Partager via


Services au moment du design

Certains services utilisés par les outils sont utilisés uniquement au moment du design. Ces services sont gérés séparément des services d’exécution d’EF Core pour les empêcher d’être déployés avec votre application. Pour remplacer l’un de ces services (par exemple, le service pour générer des fichiers de migration), ajoutez une implémentation de IDesignTimeServices à votre projet de démarrage.

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

Référencer Microsoft.EntityFrameworkCore.Design

Microsoft.EntityFrameworkCore.Design est un package DevelopmentDependency. Cela signifie que la dépendance ne transite pas de manière transitive vers d’autres projets et que vous ne pouvez pas, par défaut, référencer ses types.

Pour référencer ses types et remplacer les services au moment du design, mettez à jour les métadonnées de l’élément PackageReference dans votre fichier projet.

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

Si le package est référencé transitivement via Microsoft.EntityFrameworkCore.Tools, vous devez ajouter un PackageReference explicite au package et modifier ses métadonnées.

Liste des services

Voici une liste des services au moment du design.

Service Descriptif
IAnnotationCodeGenerator Génère le code des annotations de modèle correspondantes.
ICSharpHelper Aide à générer du code C#.
IPluralizer Pluralise et singularise les mots.
ICSharpMigrationOperationGenerator Génère du code C# pour les opérations de migration.
ICSharpSnapshotGenerator Génère du code C# pour les captures de modèle.
IMigrationsCodeGenerator Génère du code pour une migration.
IMigrationsCodeGeneratorSelector Sélectionne le générateur de code de migration approprié.
IMigrationsScaffolder Classe principale pour la gestion des fichiers de migration.
ICompiledModelCodeGenerator Génère du code pour les métadonnées du modèle compilé.
ICompiledModelCodeGeneratorSelector Sélectionne le générateur de code de modèle compilé approprié.
ICompiledModelScaffolder Classe principale pour l'échafaudage de modèles compilés.
IDatabaseModelFactory Crée un modèle de base de données à partir d’une base de données.
IModelCodeGenerator Génère du code pour un modèle.
IModelCodeGeneratorSelector Sélectionne le générateur de code de modèle approprié.
IProviderConfigurationCodeGenerator Génère du code OnConfiguring.
IReverseEngineerScaffolder Classe principale pour l'échafaudage des modèles rétro-conçus.
IScaffoldingModelFactory Crée un modèle à partir d’un modèle de base de données.
IPrecompiledQueryCodeGenerator Génère du code pour les requêtes précompilées.
IPrecompiledQueryCodeGeneratorSelector Sélectionne le générateur de code de requête précompilé approprié.

Utilisation de services

Ces services peuvent également être utiles pour créer vos propres outils. Par exemple, lorsque vous souhaitez automatiser une partie de votre flux de travail au moment du design.

Vous pouvez créer un fournisseur de services contenant ces services à l’aide des méthodes d’extension AddEntityFrameworkDesignTimeServices et 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);