工具使用的某些服務只會在設計階段使用。 這些服務會與 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);