デザイン時サービス

ツールで使用される一部のサービスは、デザイン時にのみ使用されます。 これらのサービスは EF Core のランタイム サービスとは別に管理され、アプリと一緒にデプロイされないようになっています。 これらのサービスの 1 つ (たとえば、移行ファイルを生成するサービス) をオーバーライドするには、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);