1

Я переношу приложение PHP/Illuminate в ядро ​​Core/EF для ASP.NET. Часть его состоит из процесса установки типа Wordpress, который запрашивает учетные данные для базы данных, а затем создает необходимые таблицы для работы приложения. По сути, я хочу запустить некоторую миграцию во время выполнения, как я могу, с помощью построителя схем Illuminate.Миграция во время выполнения с Entity Framework Core

Я нашел ссылку для Microsoft.EntityFrameworkCore.Migrations namespace, которая кажется связанной с тем, что я хочу сделать, но я не могу найти какую-либо документацию или рекомендации по ее использованию. Я предполагаю, что я мог бы писать необработанные SQL-запросы и выполнять их, но я бы скорее работал с хорошим, строго типизированным API, если это было возможно.

Возможно ли это с помощью EF Core, и есть ли у кого-нибудь какие-либо предложения о том, как это сделать? В настоящее время я использую Pomelo MySQL provider, если это имеет значение.

ответ

4

Предполагая, что у вас уже есть подготовленные миграции, что-то вроде этого в вашем классе запуска будет делать трюк:

public void ConfigureServices(IServiceCollection services) 
{ 
    // Wire up whatever your equivalent DbContext class is here 
    services.AddDbContext<ApplicationDbContext>(); 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    using (var scope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope()) 
    { 
     scope.ServiceProvider.GetService<ApplicationDbContext>().Database.Migrate(); 
    } 
} 
+0

Спасибо за ваш ответ. Для этого решения требуется, чтобы таблица __EFMigrationsHistory существовала до запуска Migrate(), что не может быть гарантировано в моем случае использования (предположим, что существующая база данных без таблиц). Есть ли способ обойти это? Например, можно ли вручную запустить код сборки схемы? Я должен отметить, что для этого проекта не требуется сохранение истории миграции и дальнейших миграций. – James

+1

Я не использовал его лично, но метод EnsureCreated может делать то, что вы ищете. Похоже, он полностью обходит систему миграции. https://docs.microsoft.com/en-us/ef/core/api/microsoft.entityframeworkcore.infrastructure.databasefacade#Microsoft_EntityFrameworkCore_Infrastructure_DatabaseFacade_EnsureCreated –

+0

Простое примечание: 'Database.Migrate()' не требует, чтобы таблица предыстории существовала раньше, чем он создаст его для вас в первый раз. Он используется для отслеживания миграций, применяемых в случае, если вы хотите внести изменения в базу данных в будущем. Если вы просто хотите, чтобы схема и таблицы были в первый раз и никогда не обновлялись, вы можете использовать 'context.Database.EnsureCreated()', как предлагал @BradMelanson. – Smit

Смежные вопросы