Подтвердить что ты не робот

Автоматическая создание базы данных в 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?

4b9b3361

Ответ 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 ответ