设计时服务
工具使用的某些服务仅在设计时使用。 这些服务独立于 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="3.1.9">
<PrivateAssets>all</PrivateAssets>
<!-- Remove IncludeAssets to allow compiling against the assembly -->
<!--<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>-->
</PackageReference>
如果正在通过 Microsoft.EntityFrameworkCore.Tools 过渡引用此包,必须向此包添加显式 PackageReference,以更改其元数据。
服务列表
下面是设计时服务的列表。
服务 | 说明 |
---|---|
IAnnotationCodeGenerator | 为相应的模型注释生成代码。 |
ICSharpHelper | 帮助生成 C# 代码。 |
IPluralizer | 复数和单数化字。 |
IMigrationsCodeGenerator | 生成迁移代码。 |
IMigrationsScaffolder | 用于管理迁移文件的主类。 |
IDatabaseModelFactory | 从数据库创建数据库模型。 |
IModelCodeGenerator | 为模型生成代码。 |
IProviderConfigurationCodeGenerator | 生成 OnConfiguring 代码。 |
IReverseEngineerScaffolder | 用于搭建反向工程模型基架的主类。 |
IScaffoldingModelFactory | 从数据库模型创建模型。 |
使用服务
这些服务还可用于创建自己的工具。 例如,当你想要自动执行部分设计时工作流时。
可以使用 AddEntityFrameworkDesignTimeServices 和 AddDbContextDesignTimeServices 扩展方法生成包含这些服务的服务提供程序。
var db = new MyDbContext();
// Create design-time services
var serviceCollection = new ServiceCollection();
serviceCollection.AddEntityFrameworkDesignTimeServices();
serviceCollection.AddDbContextDesignTimeServices(db);
var serviceProvider = serviceCollection.BuildServiceProvider();
// Add a migration
var migrationsScaffolder = serviceProvider.GetService<IMigrationsScaffolder>();
var migration = migrationsScaffolder.ScaffoldMigration(migrationName, rootNamespace);
migrationsScaffolder.Save(projectDir, migration, outputDir);