Konfigurowanie typu DbContextConfiguring a DbContext

W tym artykule przedstawiono podstawowe wzorce dotyczące konfigurowania DbContext za pośrednictwem DbContextOptions nawiązać połączenia z bazą danych, używając określonego dostawcy programu 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 typu DbContext w czasie projektowaniaDesign-time DbContext configuration

EF Core z czasu projektowania narzędzi, takich jak migracje muszą mieć możliwość odnajdywania i utworzyć wystąpienie pracy DbContext typu, aby można było zbierać szczegółowe informacje dotyczące typów jednostek i sposobu mapowania ich na schemat bazy danych aplikacji.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 można utworzyć narzędzie DbContext w taki sposób, że zostanie on skonfigurowany podobnie jak może zostać skonfigurowane 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 gdy wszelkie wzorzec, który dostarcza informacje o konfiguracji niezbędne do DbContext może pracować w czasie wykonywania, narzędzi, które wymagają przy użyciu DbContext w czasie projektowania może pracować tylko z ograniczonej liczby 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. Są one objęte bardziej szczegółowo w czasu projektowania, tworzenia kontekstu sekcji.These are covered in more detail in the Design-Time Context Creation section.

Konfigurowanie DbContextOptionsConfiguring DbContextOptions

DbContext musi mieć instancję DbContextOptions aby można było wykonać wszelkie prace.DbContext must have an instance of DbContextOptions in order to perform any work. DbContextOptions Wystąpienia niesie ze sobą informacje o konfiguracji takich jak:The DbContextOptions instance carries configuration information such as:

  • Dostawca bazy danych do użycia, zwykle wybrane przez wywołanie metody, takie jak UseSqlServer lub UseSqliteThe database provider to use, typically selected by invoking a method such as UseSqlServer or UseSqlite
  • Wszelkie wymagane parametry lub identyfikator wystąpienia bazy danych zazwyczaj przekazywany jako argument do podanej powyżej metody wyboru dostawcyAny necessary connection string or identifier of the database instance, typically passed as an argument to the provider selection method mentioned above
  • Żadnych selektorów poziom dostawcy, zachowanie opcjonalne, również są zazwyczaj 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 programu EF Core, zwykle połączonymi w łańcuch po lub przed metodą selektor dostawcyAny general EF Core behavior selectors, typically chained after or before the provider selector method

Poniższy przykład umożliwia skonfigurowanie DbContextOptions do używania dostawcy programu SQL Server, połączenie jest zawarty w connectionString zmienną, limit czasu polecenia poziom dostawcy i selektor zachowanie programu EF Core, która 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

Dostawca selektora metody i innych metod selektor zachowanie wymienione powyżej są metody rozszerzenia na DbContextOptions lub klasy opcji właściwe 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 obejmują zależności dodatkowych pakietów 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 argumentu konstruktora.The DbContextOptions can be supplied to the DbContext by overriding the OnConfiguring method or externally via a constructor argument.

Jeśli używane są obie, OnConfiguring ostatnio zastosowane i mogą zastąpić opcje przekazana 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 typu DbContext akceptuje także nieogólnego wersję DbContextOptions, ale przy użyciu wersji nieogólnego nie jest zalecane w przypadku aplikacji z wieloma typami 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 argumentu 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, aby zainicjować DbContext , który używa OnConfiguring:Application code to initialize a DbContext that uses OnConfiguring:

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

Porada

To podejście nie jest przystosowany do testowania, chyba że próby docelowe pełnej bazy danych.This approach does not lend itself to testing, unless the tests target the full database.

Przy użyciu iniekcji zależności typu DbContextUsing 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. 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 odpowiedni DbContextOptions<TContext> dostępne do 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 wstrzykiwania zależności:Adding the Dbcontext to dependency injection:

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

To wymaga dodania argumentu konstruktora do danego typu 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 programie 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>>();

Odczytywanie więcejMore reading