某些工具使用的服务仅在设计阶段使用。 这些服务独立于 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);