Megosztás:


Tervezési idejű szolgáltatások

Az eszközök által használt egyes szolgáltatásokat csak a tervezéskor használják. Ezeket a szolgáltatásokat az EF Core futtatókörnyezeti szolgáltatásaitól elkülönítve felügyeljük, hogy ne legyenek üzembe helyezve az alkalmazással. Ezen szolgáltatások, például a migrációs fájlok létrehozására szolgáló szolgáltatás felülbírálásához adjon hozzá egy IDesignTimeServices implementációt az indítási projekthez.

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

Hivatkozás Microsoft.EntityFrameworkCore.Design

Microsoft.EntityFrameworkCore.Design egy DevelopmentDependency csomag. Ez azt jelenti, hogy a függőség nem halad át tranzitív módon más projektekbe, és alapértelmezés szerint nem hivatkozhat a típusára.

A típusokra való hivatkozáshoz és a tervezési időalapú szolgáltatások felülbírálásához frissítse a PackageReference elem metaadatait a projektfájlban.

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

Ha a csomagra tranzitív módon hivatkozik a Microsoft.EntityFrameworkCore.Tools segítségével, explicit PackageReference-t kell hozzáadnia a csomaghoz, és módosítania kell a metaadatait.

Szolgáltatások listája

Az alábbiakban a tervezési idejű szolgáltatások listája található.

Service Description
IAnnotationCodeGenerator Létrehozza a megfelelő modelljegyzetek kódját.
ICSharpHelper Segít a C#-kód generálásában.
IPluralizer Pluralizálja és szingularizálja a szavakat.
ICSharpMigrationOperationGenerator C#-kódot hoz létre a migrálási műveletekhez.
ICSharpSnapshotGenerator C#-kódot hoz létre a modell pillanatképeihez.
IMigrationsCodeGenerator Kódot hoz létre egy migráláshoz.
IMigrationsCodeGeneratorSelector Kiválasztja a megfelelő migrálási kódgenerátort.
IMigrationsScaffolder A migrálási fájlok kezelésének fő osztálya.
ICompiledModelCodeGenerator A lefordított modell metaadatainak kódját hozza létre.
ICompiledModelCodeGeneratorSelector Kiválasztja a megfelelő lefordított modellkódgenerátort.
ICompiledModelScaffolder Az állványzatok lefordított modelljeinek fő osztálya.
IDatabaseModelFactory Adatbázismodellt hoz létre egy adatbázisból.
IModelCodeGenerator Egy modell kódját hozza létre.
IModelCodeGeneratorSelector Kiválasztja a megfelelő modellkódgenerátort.
IProviderConfigurationCodeGenerator OnConfiguring-kódot hoz létre.
IReverseEngineerScaffolder A fordítottan megtervezett modellek állványzatának fő osztálya.
IScaffoldingModelFactory Létrehoz egy modellt egy adatbázismodellből.
IPrecompiledQueryCodeGenerator Kód generálása előre összeállított lekérdezésekhez.
IPrecompiledQueryCodeGeneratorSelector Kiválasztja a megfelelő előre összeállított lekérdezéskód-generátort.

Szolgáltatások használata

Ezek a szolgáltatások saját eszközök létrehozásához is hasznosak lehetnek. Ha például a tervezési idejű munkafolyamat egy részét szeretné automatizálni.

Ezeket a szolgáltatásokat tartalmazó szolgáltatót az AddEntityFrameworkDesignTimeServices és az AddDbContextDesignTimeServices bővítménymetszetekkel hozhatja létre.

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