Konfigurowanie obiektu DbContextConfiguring a DbContext

W tym artykule przedstawiono wzorce konfigurowania DbContext z DbContextOptions.This article shows patterns for configuring a DbContext with DbContextOptions. Opcje są używane głównie aby wybrać i skonfigurować Magazyn danych.Options are primarily used to select and configure the data store.

Konfigurowanie DbContextOptionsConfiguring DbContextOptions

DbContextmusi być wystąpieniem DbContextOptions w celu wykonania.DbContext must have an instance of DbContextOptions in order to execute. Tę funkcję można skonfigurować przez zastąpienie OnConfiguring, lub zewnętrznie dostarczony przez argument konstruktora.This can be configured by overriding OnConfiguring, or supplied externally via a constructor argument.

Jeśli są używane, OnConfiguring jest wykonywana na podane opcje, co oznacza jest dodatek i może zastąpić opcje przekazany do argumentu konstruktora.If both are used, OnConfiguring is executed on the supplied options, meaning it is additive and can overwrite options supplied to the constructor argument.

Argument konstruktoraConstructor argument

Kontekst kodu za pomocą konstruktoraContext code with constructor

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

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

Porada

Podstawowy Konstruktor DbContext również zaakceptowanie wersji nieogólnego DbContextOptions.The base constructor of DbContext also accepts the non-generic version of DbContextOptions. Przy użyciu wersji nieogólnego nie jest zalecane w przypadku aplikacji o wiele typów kontekstu.Using the non-generic version is not recommended for applications with multiple context types.

Kod aplikacji, można zainicjować na podstawie argumentów konstruktoraApplication 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

Ostrzeżenie

OnConfiguringOstatnia i mogą zastąpić opcje uzyskane z Podpisane lub konstruktora.OnConfiguring occurs last and can overwrite options obtained from DI or the constructor. Takie podejście nie nadają się do testowania (chyba że zostanie rozpoczęta dla pełnej bazy danych).This approach does not lend itself to testing (unless you target the full database).

Kontekst kodu za pomocą 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");
    }
}

Kod aplikacji, aby zainicjować z OnConfiguring:Application code to initialize with OnConfiguring:

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

Przy użyciu obiektu DbContext z iniekcji zależnościUsing DbContext with dependency injection

Obsługa EF przy użyciu DbContext z kontenera iniekcji zależności.EF supports using DbContext with a dependency injection container. Danego typu DbContext można dodać do kontenera usługi za pomocą AddDbContext<TContext>.Your DbContext type can be added to the service container by using AddDbContext<TContext>.

AddDbContextspowoduje, że oba danego typu DbContext TContext, i DbContextOptions<TContext> dostępne iniekcji z kontenera usług.AddDbContext will make both your DbContext type, TContext, and DbContextOptions<TContext> available for injection from the service container.

Zobacz więcej odczytu poniżej informacje na iniekcji zależności.See more reading below for information on dependency injection.

Dodawanie dbcontext do iniekcji zależnościAdding dbcontext to dependency injection

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

Wymaga to dodawanie argument konstruktora Twojego typ DbContext, który akceptuje DbContextOptions.This requires adding a constructor argument to your DbContext type that accepts DbContextOptions.

Kontekst kodu:Context code:

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

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

Kod aplikacji (w ASP.NET Core):Application code (in ASP.NET Core):

public MyController(BloggingContext context)

Kod aplikacji (przy użyciu element ServiceProvider bezpośrednio, mniej typowe):Application code (using ServiceProvider directly, less common):

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

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

Za pomocąIDesignTimeDbContextFactory<TContext>Using IDesignTimeDbContextFactory<TContext>

Alternatywą dla powyższych opcji może również zapewniać implementację elementu IDesignTimeDbContextFactory<TContext>.As an alternative to the options above, you may also provide an implementation of IDesignTimeDbContextFactory<TContext>. Narzędzia EF umożliwia utworzenie wystąpienia DbContext z tej fabryki.EF tools can use this factory to create an instance of your DbContext. Może to być wymagane w celu umożliwienia określonego środowiska czasu projektowania, takich jak migracji.This may be required in order to enable specific design-time experiences such as migrations.

Implementuje ten interfejs, aby włączyć usługi czasu projektowania dla typów kontekstu, które nie ma publicznego konstruktora domyślnego.Implement this interface to enable design-time services for context types that do not have a public default constructor. Usługi w czasie projektowania automatycznie wykryje implementacje tego interfejsu, które znajdują się w tym samym zestawie co kontekst pochodnych.Design-time services will automatically discover implementations of this interface that are in the same assembly as the derived context.

Przykład: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);
        }
    }
}

Więcej odczytuMore reading