DbContext を構成します。Configuring a DbContext

この記事の内容を構成するためのパターンを示しています、DbContextDbContextOptionsです。This article shows patterns for configuring a DbContext with DbContextOptions. オプションは、データ ストアの構成を選択して、主に使用されます。Options are primarily used to select and configure the data store.

DbContextOptions を構成します。Configuring DbContextOptions

DbContextインスタンスがありますDbContextOptionsを実行するためにします。DbContext must have an instance of DbContextOptions in order to execute. これは、オーバーライドすることによって構成できますOnConfiguring、またはコンス トラクターの引数を使用して外部的に提供します。This can be configured by overriding OnConfiguring, or supplied externally via a constructor argument.

両方を使用すると場合、OnConfiguringは付加的なものは、指定されたオプションで実行されるコンス トラクター引数を指定したオプションを上書きします。If both are used, OnConfiguring is executed on the supplied options, meaning it is additive 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. 非ジェネリック バージョンを使用して複数のコンテキストの型を持つアプリケーションには推奨されません。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最後に発生したし、DI またはコンス トラクターから取得したオプションを上書きすることができます。OnConfiguring occurs last and can overwrite options obtained from DI or the constructor. この方法では、(ない場合、完全なデータベースが対象) のテストに適していません。This approach does not lend itself to testing (unless you target the full database).

コンテキストのコードを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");
    }
}

アプリケーション コードを使用して初期化OnConfiguring:Application code to initialize with OnConfiguring:

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

依存関係の挿入で DbContext の使用Using DbContext with dependency injection

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

AddDbContext両方、DbContext 型と、 TContext、およびDbContextOptions<TContext>サービス コンテナーからの挿入用に使用できます。AddDbContext will make both your DbContext type, TContext, and DbContextOptions<TContext> available for injection from the service container.

参照してください読み取り多くの下の依存関係の挿入に関する情報。See more reading below for information on dependency injection.

依存関係の挿入に dbcontext を追加します。Adding dbcontext to dependency injection

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

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

コンテキスト コードに示します。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 MyController(BloggingContext context)

アプリケーション コードが (サービス プロバイダーを直接使用する、一般的な方法で):Application code (using ServiceProvider directly, less common):

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

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

使用します。IDesignTimeDbContextFactory<TContext>Using IDesignTimeDbContextFactory<TContext>

上記のオプションを代わりにの実装を指定することもIDesignTimeDbContextFactory<TContext>します。As an alternative to the options above, you may also provide an implementation of IDesignTimeDbContextFactory<TContext>. EF ツールは、このファクトリを使用して、DbContext のインスタンスを作成することができます。EF tools can use this factory to create an instance of your DbContext. 移行など特定のデザイン時のエクスペリエンスを有効にするために必要な場合があります。This may be required in order to enable specific design-time experiences such as migrations.

パブリックの既定のコンス トラクターを持たないコンテキスト型のデザイン時のサービスを有効にするには、このインターフェイスを実装します。Implement this interface to enable design-time services for context types that do not have a public default constructor. デザイン時のサービスでは、派生のコンテキストと同じアセンブリ内にあるこのインターフェイスの実装を自動的に検出されます。Design-time services will automatically discover implementations of this interface that are in the same assembly as the derived context.

例:Example:

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);
        }
    }
}

複数の読み取りMore reading