一部の EF Core Tools コマンド ( Migrations コマンドなど) では、アプリケーションのエンティティ型とデータベース スキーマへのマップ方法に関する詳細を収集するために、設計時に派生 DbContext
インスタンスを作成する必要があります。 ほとんどの場合、作成される DbContext
は、実行時の構成方法と同様の方法 で構成することをお勧めします。
ツールが DbContext
を作成しようとするさまざまな方法があります。
アプリケーション サービスから
スタートアップ プロジェクトで ASP.NET Core Web ホスト または .NET Core 汎用ホストを使用している場合、ツールはアプリケーションのサービス プロバイダーから DbContext オブジェクトを取得しようとします。
ツールはまず、 Program.CreateHostBuilder()
を呼び出し、 Build()
を呼び出してから、 Services
プロパティにアクセスして、サービス プロバイダーの取得を試みます。
public class Program
{
public static void Main(string[] args)
=> CreateHostBuilder(args).Build().Run();
// EF Core uses this method at design time to access the DbContext
public static IHostBuilder CreateHostBuilder(string[] args)
=> Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(
webBuilder => webBuilder.UseStartup<Startup>());
}
public class Startup
{
public void ConfigureServices(IServiceCollection services)
=> services.AddDbContext<ApplicationDbContext>();
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
}
}
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
Note
新しい ASP.NET Core アプリケーションを作成すると、このフックは既定で含まれます。
DbContext
自体とそのコンストラクター内の依存関係は、アプリケーションのサービス プロバイダーにサービスとして登録する必要があります。 これは、DbContextOptions<TContext>
のインスタンスを引数として受け取るDbContext
にコンストラクターを持ち、AddDbContext<TContext>
メソッドを使用することで簡単に実現できます。
パラメーターのないコンストラクターの使用
アプリケーション サービス プロバイダーから DbContext を取得できない場合、ツールはプロジェクト内の派生 DbContext
型を検索します。 次に、パラメーターのないコンストラクターを使用してインスタンスを作成しようとします。
DbContext
が OnConfiguring
メソッドを使用して構成されている場合は、これが既定のコンストラクターになります。
デザイン時のファクトリから
また、 Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory<TContext> インターフェイスを実装して DbContext を作成する方法をツールに指示することもできます。このインターフェイスを実装するクラスが派生 DbContext
と同じプロジェクトまたはアプリケーションのスタートアップ プロジェクトで見つかった場合、ツールは DbContext を作成する他の方法をバイパスし、代わりにデザイン時ファクトリを使用します。
public class BloggingContextFactory : IDesignTimeDbContextFactory<BloggingContext>
{
public BloggingContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
optionsBuilder.UseSqlite("Data Source=blog.db");
return new BloggingContext(optionsBuilder.Options);
}
}
デザイン時ファクトリは、デザイン時とデザイン時に異なる方法でDbContext
を構成する必要がある場合、DbContext
コンストラクターが追加のパラメーターを DI に登録しない場合、DI をまったく使用していない場合、または何らかの理由で ASP.NET Core アプリケーションの Main
クラスにCreateHostBuilder
メソッドを使用したくない場合に特に便利です。
Args
IDesignTimeDbContextFactory<TContext>.CreateDbContextとProgram.CreateHostBuilder
の両方で、コマンド ライン引数を受け入れます。
これらの引数はツールから指定できます。
dotnet ef database update -- --environment Production
--
トークンは、後に続くすべてのものを引数として扱い、それらをオプションとして解析しないことを dotnet ef
に指示します。
dotnet ef
によって使用されない追加の引数はアプリに転送されます。
.NET