デザイン時サービス
ツールで使用される一部のサービスは、デザイン時にのみ使用されます。 これらのサービスは 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);
.NET