DbContext を構成します。Configuring a DbContext

この記事の内容を構成するための基本的なパターンを示しています、DbContextを介して、DbContextOptions特定 EF コア プロバイダーと省略可能な動作を使用してデータベースに接続します。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 コア デザイン時ツール移行を検出しての作業のインスタンスを作成する必要がある、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 コア動作セレクターAny general EF Core behavior selectors, typically chained after or before the provider selector method

次の例では、構成、DbContextOptionsに使用するには、SQL Server プロバイダーの接続が含まれている、connectionString変数、プロバイダ レベルのコマンドのタイムアウトとで実行されるすべてのクエリを使用する EF コア動作セレクター、 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 コア サポート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