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