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

コマンドには、デザイン時に作成 DbContext インスタンスが必要がある、EF ツールの一部は時間 (たとえば、移行のコマンドを実行している) 場合。Some of the EF Tools commands require a DbContext instance to be created at design time (for example, when running Migrations commands). ツールを作成しようとするさまざまな方法があります。There are various ways the tools try to create it.

アプリケーション サービスから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プロパティです。They obtain it by invoking Program.BuildWebHost() and accessing the IWebHost.Services property. 使用して、DbContext 登録IServiceCollection.AddDbContext<TContext>()見つかった、この方法で作成されたことができます。Any DbContext registered using IServiceCollection.AddDbContext<TContext>() can be found and created this way. このパターンがASP.NET Core 2.0 で導入されましたThis pattern was introduced in ASP.NET Core 2.0

既定のコンス トラクターを使用します。Using the default constructor

DbContext をアプリケーション サービス プロバイダーから取得できない場合、ツールは、プロジェクト内、DbContext 型を探します。If the DbContext can't be obtained from the application service provider, the tools look for the DbContext type inside the project. 既定のコンス トラクターを使用して作成しようとするとします。They try to create it using its default constructor.

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

見分けることができます、ツールを実装することによって、DbContext を作成する方法IDesignTimeDbContextFactoryです。You can also tell the tools how to create your DbContext by implementing IDesignTimeDbContextFactory. このインターフェイスを実装するクラスがプロジェクト内で見つかった場合、ツールは DbContext を作成するその他の方法をバイパスします。If a class implementing this interface is found inside your project, the tools bypass the other ways of creating the DbContext. 常に、これらは、デザイン時に、ファクトリを使用します。They always use the factory at design time. ファクトリは、ランタイムではなくデザイン時の DbContext を異なる方法で構成する必要がある場合に特に便利です。A factory is especially useful if you need to configure the DbContext differently for design time than at runtime.

using Microsoft.EntityFrameworkCore;
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.