设计时服务

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