DbContext の構成Configuring a DbContext

この記事では構成するための基本的なパターンをDbContextを使用して、DbContextOptions特定の EF Core プロバイダーと省略可能な動作を使用してデータベースに接続します。This article shows basic patterns for configuring a DbContext via a DbContextOptions to connect to a database using a specific EF Core provider and optional behaviors.

デザイン時 DbContext の構成Design-time DbContext configuration

EF Core のデザイン時ツール移行を検出し、作業のインスタンスを作成できる必要があります、DbContext型アプリケーションのエンティティ型とデータベース スキーマへの割り当て方法に関する詳細情報を収集するためにします。EF Core design-time tools such as migrations need to be able to discover and create a working instance of a DbContext type in order to gather details about the application's entity types and how they map to a database schema. このプロセスは、ツールを簡単に作成できる限り、自動で、DbContextことは構成する必要が同様に実行時の構成方法とするようにします。This process can be automatic as long as the tool can easily create the DbContext in such a way that it will be configured similarly to how it would be configured at run-time.

必要な構成情報を提供する任意のパターンの中に、DbContextランタイムを使用する必要とするツールで作業ができ、DbContextデザイン時にのみ使用できますパターンの数に制限します。While any pattern that provides the necessary configuration information to the DbContext can work at run-time, tools that require using a DbContext at design-time can only work with a limited number of patterns. これらについては説明について詳しく、デザイン時のコンテキストの作成セクション。These are covered in more detail in the Design-Time Context Creation section.

DbContextOptions を構成します。Configuring DbContextOptions

DbContext インスタンスが必要DbContextOptions作業を実行するためにします。DbContext must have an instance of DbContextOptions in order to perform any work. DbContextOptionsインスタンスなどの構成情報を実行します。The DbContextOptions instance carries configuration information such as:

  • データベース プロバイダーを使用するには、通常などのメソッドを呼び出すことによって選択UseSqlServerまたは UseSqliteThe database provider to use, typically selected by invoking a method such as UseSqlServer or UseSqlite
  • 任意の必要な接続文字列またはデータベースのインスタンスの識別子通常に渡される引数として上記のように、プロバイダーの選択メソッドAny necessary connection string or identifier of the database instance, typically passed as an argument to the provider selection method mentioned above
  • 通常、プロバイダーの選択メソッドの呼び出しの内部でチェーンも、任意のプロバイダ レベルの省略可能な動作セレクターAny provider-level optional behavior selectors, typically also chained inside the call to the provider selection method
  • 通常チェーン プロバイダー セレクター メソッドは前に、または後に、EF Core の一般的な動作セレクターで、Any general EF Core behavior selectors, typically chained after or before the provider selector method

次の例では、DbContextOptionsに SQL Server プロバイダーを使用する接続が含まれている、connectionString変数や、プロバイダー レベルのコマンド タイムアウトで実行されるすべてのクエリを EF Core の動作のセレクター、 DbContext追跡なし既定。The following example configures the DbContextOptions to use the SQL Server provider, a connection contained in the connectionString variable, a provider-level command timeout, and an EF Core behavior selector that makes all queries executed in the DbContext no-tracking by default:

optionsBuilder
    .UseSqlServer(connectionString, providerOptions=>providerOptions.CommandTimeout(60))
    .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);

注意

プロバイダー セレクター メソッドと上記で説明した他の動作のセレクター メソッドは、拡張メソッドが上DbContextOptionsまたはプロバイダー固有のオプション クラス。Provider selector methods and other behavior selector methods mentioned above are extension methods on DbContextOptions or provider-specific option classes. これらの拡張メソッドが、名前空間が存在する必要がありますにアクセスするために (通常Microsoft.EntityFrameworkCore) のスコープを設定して、プロジェクトに追加のパッケージの依存関係を含めます。In order to have access to these extension methods you may need to have a namespace (typically Microsoft.EntityFrameworkCore) in scope and include additional package dependencies in the project.

DbContextOptionsを指定すると、DbContextオーバーライドすることで、OnConfiguringメソッドまたはコンス トラクター引数経由で外部から。The DbContextOptions can be supplied to the DbContext by overriding the OnConfiguring method or externally via a constructor argument.

両方を使用する場合OnConfiguringが最後に適用され、コンス トラクターの引数に指定したオプションを上書きすることができます。If both are used, OnConfiguring is applied last and can overwrite options supplied to the constructor argument.

コンス トラクターの引数Constructor argument

コンス トラクターを持つコンテキスト コード:Context code with constructor:

public class BloggingContext : DbContext
{
    public BloggingContext(DbContextOptions<BloggingContext> options)
        : base(options)
    { }

    public DbSet<Blog> Blogs { get; set; }
}

ヒント

DbContext の基本コンス トラクターは、非ジェネリック バージョンのも受け入れるDbContextOptionsが非ジェネリック バージョンを使用しては複数のコンテキストの型を持つアプリケーションにはお勧めしません。The base constructor of DbContext also accepts the non-generic version of DbContextOptions, but using the non-generic version is not recommended for applications with multiple context types.

コンス トラクターの引数から初期化するためにアプリケーション コード:Application code to initialize from constructor argument:

var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
optionsBuilder.UseSqlite("Data Source=blog.db");

using (var context = new BloggingContext(optionsBuilder.Options))
{
  // do stuff
}

OnConfiguringOnConfiguring

コンテキスト コードOnConfiguring:Context code with OnConfiguring:

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite("Data Source=blog.db");
    }
}

初期化するためにアプリケーション コード、DbContextを使用してOnConfiguring:Application code to initialize a DbContext that uses OnConfiguring:

using (var context = new BloggingContext())
{
  // do stuff
}

ヒント

この方法は適していませんテスト、テスト対象のデータベースの完全な場合を除き、します。This approach does not lend itself to testing, unless the tests target the full database.

DbContext を使用して、依存関係の挿入Using DbContext with dependency injection

EF Core のサポートを使用してDbContext依存関係の注入コンテナーを使用します。EF Core supports using DbContext with a dependency injection container. 使用して、サービス コンテナーに DbContext 型を追加することができます、AddDbContext<TContext>メソッド。Your DbContext type can be added to the service container by using the AddDbContext<TContext> method.

AddDbContext<TContext> 両方の DbContext 型と、TContextと、対応するDbContextOptions<TContext>サービス コンテナーからのインジェクション用に使用できます。AddDbContext<TContext> will make both your DbContext type, TContext, and the corresponding DbContextOptions<TContext> available for injection from the service container.

参照してください参照以下の依存関係の挿入の詳細についてはします。See more reading below for additional information on dependency injection.

追加、Dbcontext依存関係の挿入。Adding the Dbcontext to dependency injection:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<BloggingContext>(options => options.UseSqlite("Data Source=blog.db"));
}

追加する必要があります、コンス トラクター引数を受け取る DbContext 型をDbContextOptions<TContext>します。This requires adding a constructor argument to your DbContext type that accepts DbContextOptions<TContext>.

コンテキスト コード:Context code:

public class BloggingContext : DbContext
{
    public BloggingContext(DbContextOptions<BloggingContext> options)
      :base(options)
    { }

    public DbSet<Blog> Blogs { get; set; }
}

アプリケーション コード (ASP.NET Core):Application code (in ASP.NET Core):

public class MyController
{
    private readonly BloggingContext _context;

    public MyController(BloggingContext context)
    {
      _context = context;
    }

    ...
}

アプリケーションのコード (サービス プロバイダーを直接使用、あまり一般的):Application code (using ServiceProvider directly, less common):

using (var context = serviceProvider.GetService<BloggingContext>())
{
  // do stuff
}

var options = serviceProvider.GetService<DbContextOptions<BloggingContext>>();

複数の読み取りMore reading