设计时服务

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