Автоматическая создание базы данных в Entity Framework Core
Мое приложение, которое портируется на ядро .NET, будет использовать новый EF Core с SQLite. Я хочу автоматически создавать базы данных и структуры таблиц при первом запуске приложения. Согласно основной документации EF это делается с помощью ручных команд
dotnet ef migrations add MyFirstMigration
dotnet ef database update
Однако я не хочу, чтобы конечный пользователь вводил эти команды и предпочел бы, чтобы приложение создавало и настраивало базу данных для первого использования. Для EF 6 существуют такие функции, как
Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>());
Но в EF Core они, похоже, не существуют. Я не могу найти никаких примеров или документации о чем-то эквивалентном ядру EF, и он не упоминается в списке недостающих функций в основной документации EF. У меня уже установлены классы классов, поэтому я мог бы написать код для инициализации базы данных на основе моделей, но было бы проще, если бы фреймворк сделал это автоматически. Я не хочу автоматически создавать модель или переносить, просто создайте структуры таблиц в новой базе данных.
Я что-то упустил или автоматически создаю функцию таблицы, отсутствующую в ядре EF?
Ответы
Ответ 1
Если вы создали миграции, вы можете выполнить их в Startup.cs.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
{
var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
context.Database.Migrate();
}
...
Это создаст базу данных и таблицы.
Адаптировано из: http://docs.identityserver.io/en/release/quickstarts/8_entity_framework.html?highlight=entity
Ответ 2
Мой ответ очень похож на ответ Рикардо, но я чувствую, что мой подход немного более прямолинейный, потому что в его функции using
так много происходит, что я даже не уверен, как именно он работает на более низкий уровень.
Итак, для тех, кто хочет простое и чистое решение, которое создает базу данных для вас, где вы точно знаете, что происходит под капотом, это для вас:
public Startup(IHostingEnvironment env)
{
using (var client = new TargetsContext())
{
client.Database.EnsureCreated();
}
}
Это в значительной степени означает, что в созданном вами DbContext
(в этом случае my называется TargetsContext
), вы можете использовать экземпляр DbContext
, чтобы гарантировать, что таблицы, определенные в классе, являются созданный при запуске Startup.cs в вашем приложении.
Ответ 3
Если вы получите контекст через список параметров Configure в Startup.cs, вы можете сделать это:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, LoggerFactory loggerFactory,
ApplicationDbContext context)
{
context.Database.Migrate();
...
Ответ 4
Если вы не создали миграции, есть 2 варианта
1.подготовьте базу данных и таблицы из приложения Main:
var context = services.GetRequiredService<YourRepository>();
context.Database.EnsureCreated();
2.Создайте таблицы, если база данных уже существует:
var context = services.GetRequiredService<YourRepository>();
context.Database.EnsureCreated();
RelationalDatabaseCreator databaseCreator =
(RelationalDatabaseCreator)context.Database.GetService<IDatabaseCreator>();
databaseCreator.CreateTables();
Спасибо Bubi ответ