Мое приложение, которое переносится на ядро .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 отсутствует функция автоматического создания таблицы?
источник
Мой ответ очень похож на ответ Рикардо, но я считаю, что мой подход немного проще просто потому, что в его
using
функции происходит так много всего, что я даже не уверен, как именно он работает на более низком уровне.Итак, для тех, кто хочет простое и понятное решение, которое создает для вас базу данных, в которой вы точно знаете, что происходит под капотом, это для вас:
public Startup(IHostingEnvironment env) { using (var client = new TargetsContext()) { client.Database.EnsureCreated(); } }
Это в значительной степени означает, что внутри
DbContext
созданного вами (в данном случае моего называется мойTargetsContext
), вы можете использовать экземпляр,DbContext
чтобы гарантировать, что таблицы, определенные в классе, создаются при запуске Startup.cs в вашем приложении.источник
EnsureCreated
полностью обходит миграции и просто создает схему для вас, вы не можете смешивать это с миграциями.EnsureCreated
разработан для тестирования или быстрого прототипирования, когда вы можете каждый раз отбрасывать и заново создавать базу данных. Если вы используете миграции и хотите, чтобы они автоматически применялись при запуске приложения, вы можете использоватьcontext.Database.Migrate()
вместо них.IHostingEnvironment
теперь он устарел, а рекомендуемая альтернативаMicrosoft.AspNetCore.Hosting.IWebHostEnvironment
.Если вы получили контекст через список параметров Configure в Startup.cs, вы можете вместо этого сделать следующее:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, LoggerFactory loggerFactory, ApplicationDbContext context) { context.Database.Migrate(); ...
источник
Для EF Core 2.0+ мне пришлось использовать другой подход, потому что они изменили API. По состоянию на март 2019 года Microsoft рекомендует помещать код миграции базы данных в класс записи приложения, но за пределами кода сборки 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>(); }
источник
Если вы не создавали миграции, есть 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();
Благодаря ответу Буби
источник
EnsureCreated
илиEnsureDeleted
илиDatabase.Migrate
не получится »