Tworzenie typu DbContext w czasie projektowaniaDesign-time DbContext Creation

Niektóre polecenia EF podstawowe narzędzia (na przykład [migracje] 1 poleceń) wymagają pochodnego DbContext wystąpienia należy utworzyć w czasie projektowania w celu zbierania informacji o aplikacji typy jednostek oraz sposobu mapowania ich na schemat bazy danych.Some of the EF Core Tools commands (for example, the Migrations commands) require a derived DbContext instance to be created at design time in order to gather details about the application's entity types and how they map to a database schema. W większości przypadków jest pożądane który DbContext utworzone w ten sposób jest skonfigurowany w sposób podobny do sposobu byłoby skonfigurowane w czasie wykonywania.In most cases, it is desirable that the DbContext thereby created is configured in a similar way to how it would be configured at run time.

Istnieją różne sposoby, spróbuj utworzyć narzędzia DbContext:There are various ways the tools try to create the DbContext:

Z usługi aplikacjiFrom application services

Twój projekt startowy w przypadku aplikacji platformy ASP.NET Core, narzędzia próby uzyskania obiektu DbContext z dostawcy usług aplikacji.If your startup project is an ASP.NET Core app, the tools try to obtain the DbContext object from the application's service provider.

Narzędzie najpierw spróbuj uzyskać dostawcę usługi za pomocą Program.BuildWebHost() i uzyskiwania dostępu do IWebHost.Services właściwości.The tool first try to obtain the service provider by invoking Program.BuildWebHost() and accessing the IWebHost.Services property.

Uwaga

Podczas tworzenia nowej aplikacji ASP.NET Core 2.0 domyślnie znajduje się ta punktu zaczepienia.When you create a new ASP.NET Core 2.0 application, this hook is included by default. W poprzednich wersjach programu EF Core i ASP.NET Core, narzędzia próbuj wywoływać Startup.ConfigureServices bezpośrednio w celu uzyskania dostawcy usług aplikacji, ale ten wzorzec już nie działa prawidłowo w aplikacjach ASP.NET Core 2.0.In previous versions of EF Core and ASP.NET Core, the tools try to invoke Startup.ConfigureServices directly in order to obtain the application's service provider, but this pattern no longer works correctly in ASP.NET Core 2.0 applications. Uaktualniania aplikacji platformy ASP.NET Core 1.x 2.0, można zmodyfikować Twoje Program klasy do nowego wzorcem.If you are upgrading an ASP.NET Core 1.x application to 2.0, you can modify your Program class to follow the new pattern.

DbContext Się i zależności w swoich konstruktorach należy zarejestrować jako usługi w aplikacji usługodawcy.The DbContext itself and any dependencies in its constructor need to be registered as services in the application's service provider. Można to łatwo osiągnąć dzięki użyciu [Konstruktor na DbContext pobierającej wystąpienia DbContextOptions<TContext> jako argument] 4 i przy użyciu [ AddDbContext<TContext> —Metoda] 5.This can be easily achieved by having a constructor on the DbContext that takes an instance of DbContextOptions<TContext> as a argument and using the AddDbContext<TContext> method.

Za pomocą konstruktora bez parametrówUsing a constructor with no parameters

Jeśli DbContext nie można uzyskać od dostawcy usług aplikacji, wyszukaj narzędzia pochodnej DbContext typ wewnątrz projektu.If the DbContext can't be obtained from the application service provider, the tools look for the derived DbContext type inside the project. Następnie próby utworzenia wystąpienia przy użyciu konstruktora bez parametrów.Then they try to create an instance using a constructor with no parameters. Może to być domyślnego konstruktora, jeśli DbContext jest konfigurowana przy użyciu [ OnConfiguring ] 6 metody.This can be the default constructor if the DbContext is configured using the OnConfiguring method.

Z fabryki czasu projektowaniaFrom a design-time factory

Możesz także wybrać narzędzia sposobu tworzenia sieci DbContext zaimplementowanie IDesignTimeDbContextFactory<TContext> interfejsu: Jeśli klasy implementującej interfejs ten znajduje się w jednym tego samego projektu jako pochodnej DbContext lub w aplikacji projekt startowy, obejście narzędzia inne metody tworzenia zamiast tego obiektu DbContext i używania fabryki czasu projektowania.You can also tell the tools how to create your DbContext by implementing the IDesignTimeDbContextFactory<TContext> interface: If a class implementing this interface is found in either the same project as the derived DbContext or in the application's startup project, the tools bypass the other ways of creating the DbContext and use the design-time factory instead.

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
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);
        }
    }
}

Uwaga

args Parametr jest aktualnie używana.The args parameter is currently unused. Brak [problemu] 7 śledzenia umożliwia określenie argumentów czasu projektowania w menu Narzędzia.There is an issue tracking the ability to specify design-time arguments from the tools.

Fabryka czasu projektowania może być szczególnie przydatne, jeśli konieczne będzie skonfigurowanie kontekstu DbContext inaczej dla czasu projektowania niż w czasie wykonywania, jeśli DbContext Konstruktor ma dodatkowe parametry nie są zarejestrowane w Podpisane, jeśli nie używasz Podpisane na wszystkich lub, jeśli dla niektórych przyczyny nie chcesz mieć BuildWebHost metody w aplikacji platformy ASP.NET CoreA design-time factory can be especially useful if you need to configure the DbContext differently for design time than at run time, if the DbContext constructor takes additional parameters are not registered in DI, if you are not using DI at all, or if for some reason you prefer not to have a BuildWebHost method in your ASP.NET Core application's
Main Klasa.Main class.