Freigeben über


Entwurfszeitdienste

Einige der von den Tools verwendeten Dienste werden nur während der Entwurfsphase verwendet. Diese Dienste werden getrennt von den Laufzeitdiensten von EF Core verwaltet, um zu verhindern, dass sie mit Ihrer App bereitgestellt werden. Um einen dieser Dienste außer Kraft zu setzen (z. B. den Dienst zum Generieren von Migrationsdateien), fügen Sie ihrem Startprojekt eine Implementierung IDesignTimeServices hinzu.

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

Verweisen auf Microsoft.EntityFrameworkCore.Design

Microsoft.EntityFrameworkCore.Design ist ein DevelopmentDependency-Paket. Dies bedeutet, dass die Abhängigkeit nicht transitiv in andere Projekte übertragen wird, und dass Sie standardmäßig nicht auf deren Typen verweisen können.

Um auf die Typen zu verweisen und Entwurfszeitdienste außer Kraft zu setzen, aktualisieren Sie die Metadaten des PackageReference-Elements in Ihrer Projektdatei.

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

Wenn auf das Paket transitiv über Microsoft.EntityFrameworkCore.Tools verwiesen wird, müssen Sie dem Paket ein explizites PackageReference hinzufügen und dessen Metadaten ändern.

Liste der Dienstleistungen

Es folgt eine Liste der Designzeitdienste.

Dienstleistung Description
IAnnotationCodeGenerator Generiert den Code für entsprechende Modellanmerkungen.
ICSharpHelper Hilft beim Generieren von C#-Code.
IPluralizer Pluralisiert und singularisiert Wörter.
ICSharpMigrationOperationGenerator Generiert C#-Code für Migrationsvorgänge.
ICSharpSnapshotGenerator Generiert C#-Code für Modell-Snapshots.
IMigrationsCodeGenerator Generiert Code für eine Migration.
IMigrationsCodeGeneratorSelector Wählt den entsprechenden Migrationscodegenerator aus.
IMigrationsScaffolder Die Hauptklasse zum Verwalten von Migrationsdateien.
ICompiledModelCodeGenerator Generiert Code für kompilierte Modellmetadaten.
ICompiledModelCodeGeneratorSelector Wählt den entsprechenden kompilierten Modellcodegenerator aus.
ICompiledModelScaffolder Die Hauptklasse für kompilierte Modelle des Gerüsts.
IDatabaseModelFactory Erstellt ein Datenbankmodell aus einer Datenbank.
IModelCodeGenerator Generiert Code für ein Modell.
IModelCodeGeneratorSelector Wählt den entsprechenden Modellcodegenerator aus.
IProviderConfigurationCodeGenerator Generiert OnConfiguring-Code.
IReverseEngineerScaffolder Die Hauptklasse für Gerüste für Reverse Engineering-Modelle.
IScaffoldingModelFactory Erstellt ein Modell aus einem Datenbankmodell.
IPrecompiledQueryCodeGenerator Generiert Code für vorkompilierte Abfragen.
IPrecompiledQueryCodeGeneratorSelector Wählt den entsprechenden vorkompilierten Abfragecodegenerator aus.

Verwenden von Diensten

Diese Dienste können auch hilfreich sein, um Eigene Tools zu erstellen. Wenn Sie beispielsweise einen Teil Ihres Entwurfszeitworkflows automatisieren möchten.

Sie können einen Dienstanbieter erstellen, der diese Dienste enthält, mithilfe der Erweiterungsmethoden "AddEntityFrameworkDesignTimeServices" und "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);