Sdílet prostřednictvím


Služby v době návrhu

Některé služby používané nástroji se používají pouze v době návrhu. Tyto služby se spravují odděleně od služeb modulu runtime EF Core, aby se zabránilo jejich nasazení s vaší aplikací. Pokud chcete přepsat jednu z těchto služeb (například službu pro generování souborů migrace), přidejte do svého spouštěcího projektu implementaci IDesignTimeServices.

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

Odkazování na Microsoft.EntityFrameworkCore.Design

Microsoft.EntityFrameworkCore.Design je balíček DevelopmentDependency. To znamená, že závislost nebude přechodně přetékat do jiných projektů a ve výchozím nastavení nebude možné odkazovat na její typy.

Pokud chcete odkazovat na jeho typy a přepsat služby v době návrhu, aktualizujte metadata položky PackageReference v souboru projektu.

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

Pokud se na balíček odkazuje tranzitivně prostřednictvím Microsoft.EntityFrameworkCore.Tools, budete muset do balíčku přidat explicitní PackageReference a změnit jeho metadata.

Seznam služeb

Následuje seznam služeb v době návrhu.

Service Description
IAnnotationCodeGenerator Vygeneruje kód pro odpovídající poznámky modelu.
ICSharpHelper Pomáhá generovat kód jazyka C#.
IPluralizer Mění slova na množné nebo jednotné číslo.
ICSharpMigrationOperationGenerator Vygeneruje kód jazyka C# pro operace migrace.
ICSharpSnapshotGenerator Vygeneruje kód jazyka C# pro snímky modelu.
IMigrationsCodeGenerator Generuje kód pro migraci.
IMigrationsCodeGeneratorSelector Vybere vhodný generátor kódu migrace.
IMigrationsScaffolder Hlavní třída pro správu migrace souborů.
ICompiledModelCodeGenerator Generuje kód pro zkompilovaná metadata modelu.
ICompiledModelCodeGeneratorSelector Vybere příslušný generátor kódu zkompilovaného modelu.
ICompiledModelScaffolder Hlavní třída pro vytváření struktury kompilovaných modelů.
IDatabaseModelFactory Vytvoří databázový model z databáze.
IModelCodeGenerator Vygeneruje kód pro model.
IModelCodeGeneratorSelector Vybere příslušný generátor kódu modelu.
IProviderConfigurationCodeGenerator Generuje kód OnConfiguring.
IReverseEngineerScaffolder Hlavní třída pro scaffolding modelů vytvořených zpětným inženýrstvím.
IScaffoldingModelFactory Vytvoří model z databázového modelu.
IPrecompiledQueryCodeGenerator Generuje kód pro předkompilované dotazy.
IPrecompiledQueryCodeGeneratorSelector Vybere příslušný předkompilovaný generátor kódu dotazu.

Používání služeb

Tyto služby můžou být užitečné také při vytváření vlastních nástrojů. Pokud například chcete automatizovat část pracovního postupu návrhu.

Pomocí rozšiřujících metod AddEntityFrameworkDesignTimeServices a AddDbContextDesignTimeServices můžete vytvořit zprostředkovatele služeb obsahující tyto služby.

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