Konfigurieren einen "DbContext"Configuring a DbContext

In diesem Artikel wird die grundlegende Muster für die Konfiguration einer DbContext über eine DbContextOptions zur Verbindung mit einer Datenbank mithilfe eines bestimmten Anbieters von EF Core und optionales Verhalten.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.

Während der Entwurfszeit "DbContext"-KonfigurationDesign-time DbContext configuration

EF Core Entwurfszeit-tools, z. B. Migrationen müssen in der Lage, um zu ermitteln, und erstellen eine Arbeitsinstanz von einem DbContext Typ sammeln Informationen zu der Anwendung Entitätstypen und wie sie ein Datenbankschema zugeordnet.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. Dieser Prozess kann automatisch erfolgen, solange das Tool leicht erstellen kann die DbContext so, dass sie auf ähnliche Weise konfiguriert werden soll, wie es zur Laufzeit konfiguriert werden sollen.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.

Während jedes Muster, das die erforderlichen Konfigurationsinformationen, bietet der DbContext können arbeiten, zur Laufzeit, Tools, die mit erfordern eine DbContext zur Entwurfszeit funktioniert nur mit einer begrenzten Anzahl von Mustern.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. Diese werden in ausführlicher behandelt die während der Entwurfszeit beim Erstellen des Serverkontexts Abschnitt.These are covered in more detail in the Design-Time Context Creation section.

Konfigurieren der "dbcontextoptions"Configuring DbContextOptions

DbContext eine Instanz des DbContextOptions um ausführen jeglicher arbeiten.DbContext must have an instance of DbContextOptions in order to perform any work. Die DbContextOptions Instanz enthält Konfigurationsinformationen, z.B.:The DbContextOptions instance carries configuration information such as:

  • Die zu verwendenden Datenbankanbieter, in der Regel ausgewählt wird, durch Aufrufen einer Methode wie z. B. UseSqlServer oder UseSqliteThe database provider to use, typically selected by invoking a method such as UseSqlServer or UseSqlite
  • Eine erforderliche Verbindungszeichenfolge oder die ID der Datenbankinstanz, in der Regel als Argument übergeben, der oben genannten Anbieter Selection-MethodeAny necessary connection string or identifier of the database instance, typically passed as an argument to the provider selection method mentioned above
  • Alle auf Anbieterebene optionales Verhalten-Selektoren, die in der Regel auch verkettet innerhalb des Aufrufs an die Anbieter-Auswahl-MethodeAny provider-level optional behavior selectors, typically also chained inside the call to the provider selection method
  • Alle allgemeinen Selektoren zur EF Core-Verhalten, verkettet in der Regel hinter oder vor der Anbieter-Selektor-MethodeAny general EF Core behavior selectors, typically chained after or before the provider selector method

Im folgenden Beispiel wird die DbContextOptions für die Verwendung den SQL Server-Anbieter eine Verbindung enthalten sind, der connectionString Variable, ein auf Anbieterebene Befehlstimeout und eine Auswahl der EF Core-Verhalten, die alle Abfragen ausgeführt werden die DbContext ohne nachverfolgung standardmäßig: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);

Hinweis

Anbieter-Selektor-Methoden und andere Verhalten Selector-Methoden, die oben genannten Erweiterungsmethoden befinden sich auf DbContextOptions oder Klassen von Anbieter-spezifische Option.Provider selector methods and other behavior selector methods mentioned above are extension methods on DbContextOptions or provider-specific option classes. Um den Zugriff auf diese besonderen Erweiterungsmethoden zu erhalten, Sie möglicherweise haben einen Namespace müssen (in der Regel Microsoft.EntityFrameworkCore) im Bereich und die Abhängigkeiten von zusätzlichen Paketen im Projekt enthalten.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.

Die DbContextOptions bereitgestellt werden kann die DbContext durch Überschreiben der OnConfiguring Methode oder extern über ein Konstruktorargument.The DbContextOptions can be supplied to the DbContext by overriding the OnConfiguring method or externally via a constructor argument.

Wenn beide verwendet werden, OnConfiguring zuletzt angewendet wird, und können überschreiben Optionen, die das Konstruktorargument angegeben.If both are used, OnConfiguring is applied last and can overwrite options supplied to the constructor argument.

KonstruktorargumentConstructor argument

Kontextcode mit Konstruktor:Context code with constructor:

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

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

Tipp

Basiskonstruktor der "DbContext" akzeptiert auch die nicht generische Version von DbContextOptions, die nicht generische Version wird jedoch nicht empfohlen für Anwendungen mit mehreren Arten von Kontext.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.

Der Anwendungscode Konstruktorargument nicht initialisieren: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

Kontextcode mit 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");
    }
}

Anwendungscode zum Initialisieren einer DbContext verwendet OnConfiguring:Application code to initialize a DbContext that uses OnConfiguring:

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

Tipp

Dieser Ansatz ist nicht selbst für Tests geeignet sind, wenn die Tests die vollständige Datenbank als Ziel.This approach does not lend itself to testing, unless the tests target the full database.

Mithilfe von "DbContext" über Dependency injectionUsing DbContext with dependency injection

EF Core unterstützt die Verwendung von DbContext mit DI-Containern.EF Core supports using DbContext with a dependency injection container. Ihr "DbContext"-Typ kann zum Dienstcontainer hinzugefügt werden, mithilfe der AddDbContext<TContext> Methode.Your DbContext type can be added to the service container by using the AddDbContext<TContext> method.

AddDbContext<TContext> veranlasst, dass sowohl Ihr "DbContext"-Typ TContext, und die entsprechende DbContextOptions<TContext> zur Einschleusung von Befehlen aus dem Dienstcontainer.AddDbContext<TContext> will make both your DbContext type, TContext, and the corresponding DbContextOptions<TContext> available for injection from the service container.

Finden Sie unter Weitere lesen unten Weitere Informationen zur Abhängigkeitsinjektion.See more reading below for additional information on dependency injection.

Hinzufügen der Dbcontext zur Dependency Injection:Adding the Dbcontext to dependency injection:

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

Dies erfordert das Hinzufügen einer Konstruktorargument in den "DbContext"-Typ, der akzeptiert DbContextOptions<TContext>.This requires adding a constructor argument to your DbContext type that accepts DbContextOptions<TContext>.

Kontextcode:Context code:

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

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

Der Anwendungscode (in ASP.NET Core):Application code (in ASP.NET Core):

public class MyController
{
    private readonly BloggingContext _context;

    public MyController(BloggingContext context)
    {
      _context = context;
    }

    ...
}

Anwendungscode (mithilfe von ServiceProvider direkt nicht so üblich):Application code (using ServiceProvider directly, less common):

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

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

Weitere InformationenMore reading