Konfigurieren ein ' DbContext 'Configuring a DbContext

In diesem Artikel erfahren Grundmuster für die Konfiguration einer DbContext über eine DbContextOptions zur Verbindung mit einer Datenbank mithilfe einer bestimmten EF-Core-Anbieter und Optionaler Verhaltensweisen.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.

Zur Entwurfszeit DbContext-KonfigurationDesign-time DbContext configuration

EF Core Entwurfszeit-tools, z. B. Migrationen müssen in der Lage zu ermitteln, und erstellen Sie eine funktionierende Instanz von einer DbContext Typ, um Details über der Anwendungsverzeichnis Entitätstypen und deren Zuordnung zum Schema einer sammeln.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 Vorgang kann automatische sein, solange das Tool leicht erstellen kann die DbContext so, dass sie auf ähnliche Weise konfiguriert werden soll, wie es zur Laufzeit konfiguriert werden würde.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.

Jedes Muster, die die erforderlichen Informationen bereitstellt, während die DbContext können zur Laufzeit, Tools, die für die Verwendung erforderlich arbeiten eine DbContext zur Entwurfszeit funktionieren 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 zur Entwurfszeit Kontext Erstellung Abschnitt.These are covered in more detail in the Design-Time Context Creation section.

Konfigurieren von DbContextOptionsConfiguring DbContextOptions

DbContext eine Instanz des DbContextOptions um alle Tasks auszuführen.DbContext must have an instance of DbContextOptions in order to perform any work. Die DbContextOptions Instanz führt Konfigurationsinformationen wie z. B.:The DbContextOptions instance carries configuration information such as:

  • Der Datenbankanbieter verwendet, in der Regel durch Aufrufen einer Methode wie z. B. ausgewählt 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, die oben genannten Anbieter AuswahlmethodeAny 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 innerhalb des Aufrufs an den Anbieter Auswahlmethode verkettetAny 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 nach oder vor der Anbieter-Selektor-MethodeAny general EF Core behavior selectors, typically chained after or before the provider selector method

Das folgende Beispiel konfiguriert die DbContextOptions für die Verwendung den SQL Server-Anbieter eine Verbindung enthalten sind, der connectionString Variable, ein Befehlstimeout auf Anbieterebene und eine EF Core Verhalten Selektor, die alle im ausgeführten Abfragen stellt der DbContext keine Überwachung 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 Auswahlzeiger-Methoden, die oben genannten Erweiterungsmethoden, sind auf DbContextOptions oder Anbieter-spezifische Klassen.Provider selector methods and other behavior selector methods mentioned above are extension methods on DbContextOptions or provider-specific option classes. Um Zugriff auf diese Erweiterungsmethoden haben, Sie möglicherweise haben einen Namespace müssen (in der Regel Microsoft.EntityFrameworkCore) im Bereich und zusätzliche paketabhängigkeiten in das Projekt einfügen.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 einen 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 Überschreiboptionen Konstruktorarguments bereitgestellt.If both are used, OnConfiguring is applied last and can overwrite options supplied to the constructor argument.

KonstruktorargumentConstructor argument

Kontextcode mit dem Konstruktor:Context code with constructor:

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

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

Tipp

Die Basis DbContext-Konstruktor akzeptiert auch die nicht generische Version der DbContextOptions, die nicht generische Version wird jedoch nicht empfohlen für Anwendungen mit mehreren Kontexttypen.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 Initialisierung: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 wird selbst für testen, nicht geeignet, es sei denn, die Tests die vollständige Datenbank als Ziel.This approach does not lend itself to testing, unless the tests target the full database.

Verwenden von ' DbContext ' mit AbhängigkeitsinjektionUsing DbContext with dependency injection

EF Core unterstützt die Verwendung von DbContext mit einen abhängigkeitseinschleusungscontainer.EF Core supports using DbContext with a dependency injection container. Die DbContext-Typ kann dem 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 die DbContext-Typ TContext, und die entsprechende DbContextOptions<TContext> für Injection aus dem Dienstcontainer verfügbar.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 für Weitere Informationen zu Abhängigkeitsinjektion.See more reading below for additional information on dependency injection.

Hinzufügen der Dbcontext zum Abhängigkeitsinjektion:Adding the Dbcontext to dependency injection:

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

Dies erfordert, Hinzufügen einer Konstruktorargument in den DbContext-Typ, das 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;
    }

    ...
}

Der Anwendungscode (mithilfe von ServiceProvider direkt, weniger übliche):Application code (using ServiceProvider directly, less common):

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

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

Weitere lesenMore reading