Moja aplikacja, która jest przenoszona do .NET core, będzie używać nowego EF Core z SQLite. Chcę automatycznie utworzyć bazę danych i struktury tabel podczas pierwszego uruchomienia aplikacji. Zgodnie z dokumentacją rdzenia EF odbywa się to za pomocą poleceń ręcznych
dotnet ef migrations add MyFirstMigration
dotnet ef database update
Jednak nie chcę, aby użytkownik końcowy wprowadzał te polecenia i wolałbym, aby aplikacja utworzyła i skonfigurowała bazę danych do pierwszego użycia. Dla EF 6 jest funkcjonalność podobna do
Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>());
Ale w EF Core wydaje się, że nie istnieją. Nie mogę znaleźć żadnych przykładów ani dokumentacji dotyczącej czegoś równoważnego dla rdzenia EF i nie ma tego na liście brakujących funkcji w dokumentacji rdzenia EF. Mam już skonfigurowane klasy modeli, więc mógłbym napisać kod do zainicjowania bazy danych w oparciu o modele, ale byłoby dużo łatwiej, gdyby framework robił to automatycznie. Nie chcę automatycznie budować modelu ani migrować, po prostu tworzę struktury tabel w nowej bazie danych.
Czy brakuje mi czegoś tutaj lub czy brakuje funkcji automatycznego tworzenia tabeli w rdzeniu EF?
źródło
Moja odpowiedź jest bardzo podobna do odpowiedzi Ricardo, ale wydaje mi się, że moje podejście jest trochę prostsze, ponieważ w jego
using
funkcji dzieje się tak dużo, że nie jestem nawet pewien, jak dokładnie działa na niższym poziomie.Więc dla tych, którzy chcą prostego i przejrzystego rozwiązania, które tworzy dla Ciebie bazę danych, w której dokładnie wiesz, co dzieje się pod maską, to jest dla Ciebie:
public Startup(IHostingEnvironment env) { using (var client = new TargetsContext()) { client.Database.EnsureCreated(); } }
To prawie oznacza, że w ramach
DbContext
tego, który utworzyłeś (w tym przypadku nazywa się mójTargetsContext
), możesz użyć wystąpienia the,DbContext
aby upewnić się, że tabele zdefiniowane w klasie są tworzone, gdy Startup.cs jest uruchamiany w twojej aplikacji.źródło
EnsureCreated
całkowicie omija migracje i po prostu tworzy schemat dla Ciebie, nie możesz tego mieszać z migracjami.EnsureCreated
jest przeznaczony do testowania lub szybkiego prototypowania, w którym można za każdym razem upuszczać i ponownie tworzyć bazę danych. Jeśli używasz migracji i chcesz, aby były automatycznie stosowane przy uruchamianiu aplikacji, możesz użyćcontext.Database.Migrate()
zamiast tego.IHostingEnvironment
jest teraz przestarzały, a zalecaną alternatywą jestMicrosoft.AspNetCore.Hosting.IWebHostEnvironment
.Jeśli uzyskasz kontekst za pośrednictwem listy parametrów Konfiguruj w Startup.cs, możesz zamiast tego zrobić to:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, LoggerFactory loggerFactory, ApplicationDbContext context) { context.Database.Migrate(); ...
źródło
W przypadku EF Core 2.0+ musiałem przyjąć inne podejście, ponieważ zmienili interfejs API. Od marca 2019 r.Microsoft zaleca umieszczenie kodu migracji bazy danych w klasie wejściowej aplikacji, ale poza kodem kompilacji WebHost.
public class Program { public static void Main(string[] args) { var host = CreateWebHostBuilder(args).Build(); using (var serviceScope = host.Services.CreateScope()) { var context = serviceScope.ServiceProvider.GetRequiredService<PersonContext>(); context.Database.Migrate(); } host.Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>(); }
źródło
Jeśli nie utworzyłeś migracji, są dwie opcje
1. utwórz bazę danych i tabele z aplikacji Main:
var context = services.GetRequiredService<YourRepository>(); context.Database.EnsureCreated();
2. utwórz tabele, jeśli baza danych już istnieje:
var context = services.GetRequiredService<YourRepository>(); context.Database.EnsureCreated(); RelationalDatabaseCreator databaseCreator = (RelationalDatabaseCreator)context.Database.GetService<IDatabaseCreator>(); databaseCreator.CreateTables();
Dzięki odpowiedzi Bubi
źródło
EnsureCreated
lubEnsureDeleted
czyDatabase.Migrate
nie uda”