Konfigurowanie obiektu DbContextConfiguring a DbContext

W tym artykule przedstawiono wzorców podstawowych konfigurowania DbContext za pośrednictwem DbContextOptions nawiązać połączenia z bazą danych przy użyciu określonego dostawcy EF Core i opcjonalnie zachowania.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.

Konfiguracja obiektu DbContext czasu projektowaniaDesign-time DbContext configuration

Czasu projektowania EF podstawowych narzędzi, takich jak migracje muszą mieć możliwość odnajdywania i Utwórz wystąpienie pracy DbContext typu w celu zbierania szczegóły dotyczące typów jednostek aplikacji oraz sposobu mapowania ich na schemat bazy danych.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. Ten proces może być automatyczna, tak długo, jak łatwo utworzyć narzędzie DbContext w taki sposób, że będzie on podobnie skonfigurowany sposób może zostać skonfigurowana w czasie wykonywania.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.

Podczas żadnych wzorzec, który zawiera informacje o konfiguracji niezbędne do DbContext może działać w czasie wykonywania, narzędzi, które wymagają przy użyciu DbContext w czasie projektowania może pracować tylko z ograniczoną liczbą wzorców.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. Te są opisane bardziej szczegółowo w tworzenie kontekstu w czasie projektowania sekcji.These are covered in more detail in the Design-Time Context Creation section.

Konfigurowanie DbContextOptionsConfiguring DbContextOptions

DbContext musi być wystąpieniem DbContextOptions w celu wykonywania pracy.DbContext must have an instance of DbContextOptions in order to perform any work. DbContextOptions Wystąpienia niesie informacje o konfiguracji, takich jak:The DbContextOptions instance carries configuration information such as:

  • Dostawca bazy danych do użycia, zazwyczaj wybierana przez wywołanie metody, takie jak UseSqlServer lub UseSqliteThe database provider to use, typically selected by invoking a method such as UseSqlServer or UseSqlite
  • Wszystkie niezbędne parametry lub identyfikator wystąpienia bazy danych zazwyczaj przekazanego jako argument do metody wyboru dostawcy wymienione powyżejAny necessary connection string or identifier of the database instance, typically passed as an argument to the provider selection method mentioned above
  • Wszystkie selektory zachowanie opcjonalne poziomie dostawcy, zwykle także powiązane wewnątrz wywołania metody wyboru dostawcyAny provider-level optional behavior selectors, typically also chained inside the call to the provider selection method
  • Wszelkie ogólne selektorów zachowanie EF Core, zwykle łańcuchowej po lub przed wywołaniem metody selektora dostawcyAny general EF Core behavior selectors, typically chained after or before the provider selector method

Poniższy przykład konfiguruje DbContextOptions korzysta z dostawcy programu SQL Server, połączenie zawarte w connectionString zmiennej, limit czasu polecenia poziomie dostawcy i selektor zachowanie EF Core sprawia, że wszystkie zapytania wykonywane w DbContext śledzenia nie domyślnie: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);

Uwaga

Metody selektora dostawcy i innych metod selektora zachowanie wymienione powyżej są metody rozszerzenia na DbContextOptions lub klasy opcji specyficznych dla dostawcy.Provider selector methods and other behavior selector methods mentioned above are extension methods on DbContextOptions or provider-specific option classes. Aby uzyskać dostęp do tych metod rozszerzenia może być konieczne przestrzeń nazw (zazwyczaj Microsoft.EntityFrameworkCore) w zakres i zawierać pakiet dodatkowe zależności w projekcie.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 Mogą być dostarczane do DbContext przez zastąpienie OnConfiguring metody lub zewnętrznie za pośrednictwem argumentów konstruktora.The DbContextOptions can be supplied to the DbContext by overriding the OnConfiguring method or externally via a constructor argument.

Jeśli używana zarówno OnConfiguring ostatnio zastosowane i mogą zastąpić opcje przekazany do argumentu konstruktora.If both are used, OnConfiguring is applied last and can overwrite options supplied to the constructor argument.

Argument konstruktoraConstructor argument

Kontekst kodu za pomocą konstruktora:Context 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, ale przy użyciu wersji nieogólnego nie jest zalecane w przypadku aplikacji o wiele typów kontekstu.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.

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

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 w celu zainicjowania DbContext używającą OnConfiguring:Application code to initialize a DbContext that uses OnConfiguring:

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

Porada

Takie podejście nie nadają się do testowania, chyba, że testy target pełnej bazy danych.This approach does not lend itself to testing, unless the tests target the full database.

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

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

AddDbContext<TContext> spowoduje, że oba danego typu DbContext TContexti odpowiadający mu DbContextOptions<TContext> dostępne iniekcji z kontenera usług.AddDbContext<TContext> will make both your DbContext type, TContext, and the corresponding DbContextOptions<TContext> available for injection from the service container.

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

Dodawanie Dbcontext do iniekcji zależności:Adding the 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<TContext>.This requires adding a constructor argument to your DbContext type that accepts DbContextOptions<TContext>.

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 class MyController
{
    private readonly BloggingContext _context;

    public MyController(BloggingContext context)
    {
      _context = 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>>();

Więcej odczytuMore reading