共用方式為


設計階段服務

工具使用的某些服務只會在設計階段使用。 這些服務會與 EF Core 的執行階段服務分開管理,以防止它們與您的應用程式一起部署。 若要覆寫這些服務之一(例如產生遷移檔案的服務),請將 IDesignTimeServices 的實作新增至您的啟動專案。

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

參考 Microsoft.EntityFrameworkCore.Design

Microsoft.EntityFrameworkCore.Design 是 DevelopmentDependency 套件。 這表示相依性不會傳遞流入其他專案,而且預設情況下您無法參考其類型。

若要參考其類型並覆寫設計階段服務,請更新專案檔中 PackageReference 項目的中繼資料。

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

如果套件是透過 Microsoft.EntityFrameworkCore.Tools 進行間接參考,您必須在專案文件中新增明確的 PackageReference,並變更其中繼資料。

服務清單

以下是設計階段服務的清單。

服務 Description
IAnnotationCodeGenerator 產生對應模型註釋的程式碼。
ICSharpHelper 幫助生成 C# 代碼。
IPluralizer 將詞彙轉換為複數和單數形式。
ICSharpMigrationOperationGenerator 產生移轉作業的 C# 程式碼。
ICSharpSnapshotGenerator 生成 C# 程式碼以產生模型快照集。
IMigrationsCodeGenerator 產生移轉的程式碼。
IMigrationsCodeGeneratorSelector 選取適當的移轉程式碼產生器。
IMigrationsScaffolder 管理移轉檔案的主要類別。
ICompiledModelCodeGenerator 產生已編譯模型中繼資料的程式碼。
ICompiledModelCodeGeneratorSelector 選取適當的已編譯模型程式碼產生器。
ICompiledModelScaffolder 用於搭建編譯模型的主要類別。
IDatabaseModelFactory 從資料庫建立資料庫模型。
IModelCodeGenerator 產生模型的程式碼。
IModelCodeGeneratorSelector 選取適當的模型程式碼產生器。
IProviderConfigurationCodeGenerator 產生 OnConfiguring 程式碼。
IReverseEngineerScaffolder 腳手架逆向工程模型的主要類別。
IScaffoldingModelFactory 從資料庫模型建立模型。
IPrecompiledQueryCodeGenerator 產生預先編譯查詢的程式碼。
IPrecompiledQueryCodeGeneratorSelector 選取適當的預先編譯查詢程式碼產生器。

使用服務

這些服務對於創建您自己的工具也很有用。 例如,當您想要自動化部分設計階段工作流程時。

您可以使用 AddEntityFrameworkDesignTimeServices 和 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);