次の方法で共有


デザイン時サービス

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