Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Niektóre polecenia narzędzi EF Core Tools (na przykład polecenia Migracje ) wymagają utworzenia wystąpienia pochodnego DbContext w czasie projektowania w celu zebrania szczegółów dotyczących typów jednostek aplikacji i sposobu mapowania ich na schemat bazy danych. W większości przypadków pożądane jest, aby utworzony DbContext był skonfigurowany podobnie jak byłby skonfigurowany w czasie wykonywania.
Istnieją różne sposoby, w jaki narzędzia próbują utworzyć element DbContext. Jeśli element IDesignTimeDbContextFactory<TContext> zostanie znaleziony, narzędzia używają go zamiast innych wzorców tworzenia. Fabryka czasu projektowania jest zalecanym wzorcem dla oddzielnego projektu migracji i aplikacji, których projekt startowy jest specyficzny dla platformy.
Z usług aplikacji
Jeśli projekt startowy używa hosta internetowego platformy ASP.NET Core lub hosta ogólnego platformy .NET Core, narzędzia próbują uzyskać obiekt DbContext od dostawcy usług aplikacji.
Narzędzia najpierw próbują uzyskać dostawcę usług, wywołując metodę Program.CreateHostBuilder(), następnie wywołując Build(), a na końcu uzyskując dostęp do właściwości Services.
public class Program
{
public static void Main(string[] args)
=> CreateHostBuilder(args).Build().Run();
// EF Core uses this method at design time to access the DbContext
public static IHostBuilder CreateHostBuilder(string[] args)
=> Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(
webBuilder => webBuilder.UseStartup<Startup>());
}
public class Startup
{
public void ConfigureServices(IServiceCollection services)
=> services.AddDbContext<ApplicationDbContext>();
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
}
}
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
Note
Podczas tworzenia nowej aplikacji ASP.NET Core ten punkt zaczepienia jest domyślnie dołączany.
Samo DbContext i wszelkie zależności w konstruktorze muszą być zarejestrowane jako usługi u dostawcy usług aplikacji. Można to łatwo osiągnąć, używając konstruktora
Używanie konstruktora bez parametrów
Jeśli nie można uzyskać obiektu DbContext od dostawcy usług aplikacji, narzędzia szukają typu pochodnego DbContext w projekcie. Następnie próbują utworzyć wystąpienie przy użyciu konstruktora bez parametrów. Może to być domyślny konstruktor, jeśli DbContext jest skonfigurowany przy użyciu OnConfiguring metody .
Z fabryki czasu projektowania oprogramowania
Możesz również powiedzieć narzędziom, jak utworzyć DbContext, implementując interfejs Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory<TContext>: Jeśli klasa implementująca ten interfejs zostanie znaleziona w tym samym projekcie co pochodny DbContext lub w projekcie startowym aplikacji, narzędzia pomijają inne sposoby tworzenia DbContext i zamiast tego używają fabryki czasu projektowania.
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);
}
}
Fabryka czasu projektowania może być szczególnie przydatna, jeśli konstruktor kontekstu ma zależności, które nie są zarejestrowane w di, jeśli nie używasz di lub jeśli projekt uruchamiania aplikacji nie może być wykonywany przez narzędzia.
Skonfiguruj tego samego dostawcę, opcje modelu i zestaw migracji w czasie projektowania używany przez aplikację w czasie wykonywania. W przeciwnym razie narzędzia mogą wykonywać migracje szkieletowe dla modelu, który różni się od modelu używanego przez aplikację. Nie zakładaj, że istnieje opcjonalny argument wiersza polecenia; zweryfikuj argumenty i podaj odpowiednie źródło domyślne lub konfiguracyjne.
Args
Zarówno IDesignTimeDbContextFactory<TContext>.CreateDbContext , jak i Program.CreateHostBuilder akceptują argumenty wiersza polecenia.
Te argumenty można określić za pomocą narzędzi:
dotnet ef database update -- --environment Production
Token -- kieruje dotnet ef do traktowania wszystkich następujących elementów jako argumentów, nie próbując interpretować ich jako opcji. Wszelkie dodatkowe argumenty, które nie są używane przez dotnet ef, są przekazywane do aplikacji.