デザイン時 DbContext 作成Design-time DbContext Creation

EF Core ツールのコマンドの一部 (たとえば、移行コマンド) 派生を必要とDbContextアプリケーションの詳細を収集するためにデザイン時に作成されるインスタンスエンティティ型とデータベース スキーマへの割り当て方法。Some of the EF Core Tools commands (for example, the Migrations commands) require a derived DbContext instance to be created at design time in order to gather details about the application's entity types and how they map to a database schema. ほとんどの場合は望ましいをDbContext作成されたことがどのようになりますと同様の方法で構成されている実行時に構成されているIn most cases, it is desirable that the DbContext thereby created is configured in a similar way to how it would be configured at run time.

さまざまな方法で作成しようとしているツール、 DbContext:There are various ways the tools try to create the DbContext:

アプリケーション サービスからFrom application services

ASP.NET Core アプリをスタートアップ プロジェクトには、ツールは、アプリケーションのサービス プロバイダーから DbContext オブジェクトを取得しようとします。If your startup project is an ASP.NET Core app, the tools try to obtain the DbContext object from the application's service provider.

呼び出すことによって、サービス プロバイダーを取得するツールがまずProgram.BuildWebHost()にアクセスして、IWebHost.Servicesプロパティ。The tools first try to obtain the service provider by invoking Program.BuildWebHost() and accessing the IWebHost.Services property.

注意

新しい ASP.NET Core 2.0 アプリケーションを作成するときに、このフックは既定で含まれています。When you create a new ASP.NET Core 2.0 application, this hook is included by default. EF Core と ASP.NET Core の以前のバージョンでツールが起動しようStartup.ConfigureServices不要になったアプリケーションのサービスのプロバイダーがこのパターンを取得するために正常に ASP.NET Core 2.0 アプリケーションで直接します。In previous versions of EF Core and ASP.NET Core, the tools try to invoke Startup.ConfigureServices directly in order to obtain the application's service provider, but this pattern no longer works correctly in ASP.NET Core 2.0 applications. ASP.NET Core 1.x アプリケーションを 2.0 にアップグレードする場合は、変更、Program新しいパターンに従うクラスします。If you are upgrading an ASP.NET Core 1.x application to 2.0, you can modify your Program class to follow the new pattern.

DbContext自体、およびそのコンス トラクターで依存関係は、アプリケーションのサービス プロバイダーのサービスとして登録されている必要があります。The DbContext itself and any dependencies in its constructor need to be registered as services in the application's service provider. ことによって簡単に達成このコンス トラクター、DbContextのインスタンスを受け取るDbContextOptions<TContext>を引数としてを使用して、 AddDbContext<TContext> メソッド.This can be easily achieved by having a constructor on the DbContext that takes an instance of DbContextOptions<TContext> as an argument and using the AddDbContext<TContext> method.

パラメーターなしのコンス トラクターを使用します。Using a constructor with no parameters

DbContext をアプリケーションのサービス プロバイダーから取得できない場合、ツールを探して、派生DbContextプロジェクト内の型。If the DbContext can't be obtained from the application service provider, the tools look for the derived DbContext type inside the project. パラメーターなしのコンス トラクターを使用してインスタンスを作成、再試行してください。Then they try to create an instance using a constructor with no parameters. 場合、既定のコンス トラクターができます、DbContextを使用して、構成、 [ OnConfiguring ] 6メソッド。This can be the default constructor if the DbContext is configured using the OnConfiguring method.

デザイン時のファクトリからFrom a design-time factory

見分けることができます、ツールを実装することで、DbContext を作成する方法、IDesignTimeDbContextFactory<TContext>インターフェイス: このインターフェイスを実装するクラスを派生と同じプロジェクトのいずれかで見つかった場合DbContextまたはアプリケーションのスタートアップ プロジェクトで、ツールのバイパス他の方法の代わりに、DbContext と使用、デザイン時のファクトリを作成します。You can also tell the tools how to create your DbContext by implementing the IDesignTimeDbContextFactory<TContext> interface: If a class implementing this interface is found in either the same project as the derived DbContext or in the application's startup project, the tools bypass the other ways of creating the DbContext and use the design-time factory instead.

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.EntityFrameworkCore.Infrastructure;

namespace MyProject
{
    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);
        }
    }
}

注意

argsパラメーターは現在使用されていません。The args parameter is currently unused. ある問題追跡ツールからのデザイン時の引数を指定する機能。There is an issue tracking the ability to specify design-time arguments from the tools.

デザイン時のファクトリは、場合、実行時によりも、デザイン時の異なる方法で DbContext を構成する必要がある場合に特に役立ちます、 DbContext DI をまったく使用しない場合に、追加のパラメーターは、DI に登録されていないコンス トラクターがまたはのいくつかの場合理由を行わない、BuildWebHostメソッドで、ASP.NET Core アプリケーションのMainクラス。A design-time factory can be especially useful if you need to configure the DbContext differently for design time than at run time, if the DbContext constructor takes additional parameters are not registered in DI, if you are not using DI at all, or if for some reason you prefer not to have a BuildWebHost method in your ASP.NET Core application's Main class.