Dela via


Designtidstjänster

Vissa tjänster som används av verktygen används endast vid designtillfället. Dessa tjänster hanteras separat från EF Cores körningstjänster för att förhindra att de distribueras med din app. Om du vill åsidosätta en av dessa tjänster (till exempel tjänsten för att generera migreringsfiler) lägger du till en implementering av IDesignTimeServices i startprojektet.

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

Referera till Microsoft.EntityFrameworkCore.Design

Microsoft.EntityFrameworkCore.Design är ett DevelopmentDependency-paket. Det innebär att beroendet inte flödar transitivt till andra projekt och att du som standard inte kan referera till dess typer.

För att referera till dess typer och åsidosätta designtidstjänster uppdaterar du PackageReference-objektets metadata i projektfilen.

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

Om paketet refereras transitivt via Microsoft.EntityFrameworkCore.Tools måste du lägga till en explicit PackageReference i paketet och ändra dess metadata.

Lista över tjänster

Följande är en lista över designtidstjänster.

Tjänster Description
IAnnotationCodeGenerator Genererar koden för motsvarande modellanteckningar.
ICSharpHelper Hjälper till med att generera C#-kod.
IPluralizer Pluraliserar och singulariserar ord.
ICSharpMigrationOperationGenerator Genererar C#-kod för migreringsåtgärder.
ICSharpSnapshotGenerator Genererar C#-kod för modellögonblicksbilder.
IMigrationsCodeGenerator Genererar kod för en migrering.
IMigrationsCodeGeneratorSelector Väljer lämplig kodgenerator för migrering.
IMigrationsScaffolder Huvudklassen för hantering av migreringsfiler.
ICompiledModelCodeGenerator Genererar kod för kompilerade modellmetadata.
ICompiledModelCodeGeneratorSelector Väljer lämplig kompilerad modellkodgenerator.
ICompiledModelScaffolder Huvudklassen för att strukturera kompilerade modeller.
IDatabaseModelFactory Skapar en databasmodell från en databas.
IModelCodeGenerator Genererar kod för en modell.
IModelCodeGeneratorSelector Väljer lämplig modellkodgenerator.
IProviderConfigurationCodeGenerator Genererar OnConfiguring-kod.
IReverseEngineerScaffolder Huvudklassen för att bygga strukturer för reverse engineering-modeller.
IScaffoldingModelFactory Skapar en modell från en databasmodell.
IPrecompiledQueryCodeGenerator Genererar kod för förkompilerade frågor.
IPrecompiledQueryCodeGeneratorSelector Väljer lämplig fördefinierad frågekodgenerator.

Använda tjänster

Dessa tjänster kan också vara användbara för att skapa egna verktyg. När du till exempel vill automatisera en del av ditt arbetsflöde för designtid.

Du kan skapa en tjänstleverantör som innehåller dessa tjänster med hjälp av tilläggsmetoderna AddEntityFrameworkDesignTimeServices och 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);