Bagikan melalui


Layanan saat desain

Beberapa layanan yang digunakan oleh alat hanya digunakan pada waktu desain. Layanan ini dikelola secara terpisah dari layanan runtime EF Core untuk mencegah layanan tersebut disebarkan dengan aplikasi Anda. Untuk mengambil alih salah satu layanan ini (misalnya layanan untuk menghasilkan file migrasi), tambahkan implementasi IDesignTimeServices ke proyek startup Anda.

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

Referensi Microsoft.EntityFrameworkCore.Design

Microsoft.EntityFrameworkCore.Design adalah paket DevelopmentDependency. Ini berarti bahwa dependensi tidak akan mengalir secara transitif ke proyek lain, dan Anda tidak dapat, secara default, mereferensikan jenisnya.

Untuk mereferensikan tipe dan menggantikan layanan waktu desain, perbarui metadata item PackageReference dalam file proyek Anda.

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

Jika paket direferensikan secara transitif melalui Microsoft.EntityFrameworkCore.Tools, Anda harus menambahkan PackageReference eksplisit ke paket dan mengubah metadatanya.

Daftar layanan

Berikut ini adalah daftar layanan waktu desain.

Pelayanan Description
IAnnotationCodeGenerator Menghasilkan kode untuk anotasi model yang sesuai.
ICSharpHelper Membantu menghasilkan kode C#.
IPluralizer Pluralisasi dan mensingkularisasi kata- kata.
ICSharpMigrationOperationGenerator Menghasilkan kode C# untuk operasi migrasi.
ICSharpSnapshotGenerator Menghasilkan kode C# untuk rekam jepret model.
IMigrationsCodeGenerator Menghasilkan kode untuk migrasi.
IMigrationsCodeGeneratorSelector Memilih generator kode migrasi yang sesuai.
IMigrationsScaffolder Kelas utama untuk mengelola file migrasi.
ICompiledModelCodeGenerator Menghasilkan kode untuk metadata model yang dikompilasi.
ICompiledModelCodeGeneratorSelector Memilih generator yang sesuai untuk kode model terkompilasi.
ICompiledModelScaffolder Kelas utama untuk scaffolding model yang dikompilasi.
IDatabaseModelFactory Membuat model database dari basis data.
IModelCodeGenerator Menghasilkan kode untuk model.
IModelCodeGeneratorSelector Memilih generator kode model yang sesuai.
IProviderConfigurationCodeGenerator Menghasilkan kode OnConfiguring.
IReverseEngineerScaffolder Kelas utama untuk pengembangan model yang telah direkayasa balik.
IScaffoldingModelFactory Membuat model dari model database.
IPrecompiledQueryCodeGenerator Menghasilkan kode untuk kueri yang telah dikompilasi sebelumnya.
IPrecompiledQueryCodeGeneratorSelector Memilih generator kode kueri yang telah dikompilasi yang sesuai.

Menggunakan layanan

Layanan ini juga dapat berguna untuk membuat alat Anda sendiri. Misalnya, ketika Anda ingin mengotomatiskan sebagian dari proses kerja selama waktu desain Anda.

Anda dapat membangun penyedia layanan yang berisi layanan ini menggunakan metode ekstensi AddEntityFrameworkDesignTimeServices dan 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);