Konfigurieren ein ' DbContext 'Configuring a DbContext

In diesem Artikel werden die unzulässigen Muster für die Konfiguration einer DbContext mit DbContextOptions.This article shows patterns for configuring a DbContext with DbContextOptions. Optionen werden in erster Linie zum auswählen und konfigurieren den Datenspeicher.Options are primarily used to select and configure the data store.

Konfigurieren von DbContextOptionsConfiguring DbContextOptions

DbContexteine Instanz des DbContextOptions um auszuführen.DbContext must have an instance of DbContextOptions in order to execute. Dies kann durch Außerkraftsetzen konfiguriert werden OnConfiguring, oder extern über einen Konstruktorargument angegeben.This can be configured by overriding OnConfiguring, or supplied externally via a constructor argument.

Wenn beide verwendet werden, OnConfiguring ausgeführt wird, auf den angegebenen Optionen, d. h., es ist Additive und kann für Konstruktorarguments angegebenen Optionen für das überschreiben.If both are used, OnConfiguring is executed on the supplied options, meaning it is additive and can overwrite options supplied to the constructor argument.

KonstruktorargumentConstructor argument

Kontextcode mit-KonstruktorContext 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.The base constructor of DbContext also accepts the non-generic version of DbContextOptions. Verwenden die nicht generische Version wird nicht für Anwendungen mit mehreren Kontexttypen empfohlen.Using the non-generic version is not recommended for applications with multiple context types.

Anwendungscode Konstruktorargument InitialisierungApplication 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

Warnung

OnConfiguringTritt auf, zuletzt und Optionen, die aus abgerufen, DI oder der Konstruktor überschreiben können.OnConfiguring occurs last and can overwrite options obtained from DI or the constructor. Dieser Ansatz ist nicht verleiten testen (es sei denn, Sie die vollständige Datenbank ausgerichtet sein).This approach does not lend itself to testing (unless you target the full database).

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 bei OnConfiguring:Application code to initialize with OnConfiguring:

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

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

EF unterstützt die Verwendung von DbContext mit einen abhängigkeitseinschleusungscontainer.EF supports using DbContext with a dependency injection container. Der DbContext-Typ kann dem Dienstcontainer hinzugefügt werden, mithilfe von AddDbContext<TContext>.Your DbContext type can be added to the service container by using AddDbContext<TContext>.

AddDbContextveranlasst, dass sowohl die DbContext-Typ TContext, und DbContextOptions<TContext> für Injection aus dem Dienstcontainer verfügbar.AddDbContext will make both your DbContext type, TContext, and DbContextOptions<TContext> available for injection from the service container.

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

Abhängigkeitsinjektion Dbcontext hinzugefügtAdding 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.This requires adding a constructor argument to your DbContext type that accepts DbContextOptions.

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 MyController(BloggingContext 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>>();

Mithilfe vonIDesignTimeDbContextFactory<TContext>Using IDesignTimeDbContextFactory<TContext>

Als Alternative zu den oben genannten Optionen können Sie auch eine Implementierung bereitstellen IDesignTimeDbContextFactory<TContext>.As an alternative to the options above, you may also provide an implementation of IDesignTimeDbContextFactory<TContext>. EF-Tools können diese Factory zum Erstellen einer Instanz von Ihrem DbContext.EF tools can use this factory to create an instance of your DbContext. Dies möglicherweise erforderlich, um bestimmte zur Entwurfszeit Erfahrungen z. B. Migrationen zu erzielen.This may be required in order to enable specific design-time experiences such as migrations.

Implementieren Sie diese Schnittstelle, um Entwurfszeitdienste für Kontexttypen zu aktivieren, die nicht über einen öffentlichen Standardkonstruktor verfügen.Implement this interface to enable design-time services for context types that do not have a public default constructor. Entwurfszeitdienste erkennt automatisch Implementierungen dieser Schnittstelle, die sich in derselben Assembly wie den abgeleiteten Kontext befinden.Design-time services will automatically discover implementations of this interface that are in the same assembly as the derived context.

Beispiel: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);
        }
    }
}

Weitere lesenMore reading