ASP - Core Migrate EF Core SQL DB при запуске

Возможно ли, чтобы мой ASP Core Web API гарантировал, что БД переведена на последнюю миграцию с использованием EF Core? Я знаю, что это можно сделать из командной строки, но я хочу сделать это программно.

Обновить

На основании ответа от Janshair Khan я придумал этот класс помощников:

using Microsoft.AspNetCore.Builder;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using MyWebApi.Models;

namespace MyWebApi
{
    public static class DataSeeder
    {
        public static void SeedData(this IApplicationBuilder app)
        {
            var context = app.ApplicationServices.GetService<MyContext>();

            if (!context.Database.EnsureCreated())
                context.Database.Migrate();
        }
    }
}

Вы можете позвонить изConfigure метод в вашемStartup.cs как это:

app.SeedData();
 Bassam Alugili13 июн. 2016 г., 12:59
еще не сделано, это должно быть реализовано в следующей версии. Вы можете использовать обходной путь, который размещен ниже от Хан.
 Matt Varblow13 окт. 2017 г., 15:10
Смотрите ответы ниже. Вы должны использовать либо EnsureCreated или Migrate. Не оба.
 Oswin04 июн. 2018 г., 18:28
Официальная документация гласит: «Не вызывайте EnsureCreated () перед Migrate (). EnsureCreated () обходит Migrations для создания схемы и вызывает сбой Migrate (). ' :docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/...

Ответы на вопрос(7)

Используйте приведенный ниже код для запуска миграции на

public async void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
    {
        var context = serviceScope.ServiceProvider.GetService<YourContext`enter code here`>();
        context.Database.Migrate();
    }
}

public static class EnsureMigration
{
    public static void EnsureMigrationOfContext<T>(this IApplicationBuilder app) where T:DbContext
    {
        var context = app.ApplicationServices.GetService<T>();
        context.Database.Migrate();
    }
}

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

Использование:

app.EnsureMigrationOfContext<context>();

который создал метод расширения. Это исправляет ошибку, которая выдается так, как она была написана.

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.AspNetCore.Builder;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;

namespace MyApp.Extensions
{
    public static class IApplicationBuilderExtensions
    {
        public static void SyncMigrations<T>(this IApplicationBuilder app) where T : DbContext
        {
            using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
            {
                var context = serviceScope.ServiceProvider.GetService<DbContext>();
                context.Database.Migrate();
            }
        }
    }
}

db.Database.EnsureCreated():

Обратите внимание, что этот API не использует миграции для создания базы данных. Кроме того, созданная база данных не может быть позже обновлена ​​с помощью миграций. Если вы ориентируетесь на реляционную базу данных и используете миграции, вы можете использовать метод DbContext.Database.Migrate (), чтобы убедиться, что база данных создана и все миграции применены.

Вы можете просто захотеть позвонитьdb.Database.Migrate().

Комментарий взят из источника, найденного выше декларацииВот.

 rad28 июн. 2019 г., 10:41
Это не работает для возврата миграции!

основываясь на предыдущих ответах здесь иответ Баиландо Баиландо на "Как и где вызывать Database.EnsureCreated и Database.Migrate?«:

Startup.cs

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.EntityFrameworkCore;

namespace MyApp
{
    public class Startup
    {
        // ... (only relevant code included) ...

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<MyAppContext>(options => 
                options.UseSqlServer(Configuration.GetConnectionString("MyAppContext")));
            // ...
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            using (var serviceScope = app.ApplicationServices.CreateScope())
            {
                var context = serviceScope.ServiceProvider.GetService<MyAppContext>();
                context.Database.Migrate();
            }
            // ...
        }
    }
}

Проект с использованием этого кодадоступны на Github.

Решение Вопроса

Ты можешь использовать

db.Database.EnsureCreated();

чтобы получить вашу базу данных в актуальном состоянии с вашей текущей моделью. Если вы хотите включить миграцию (если есть подозрения на последующие миграции), используйте

db.Database.Migrate();

и поместите ваши последующие миграции со временем.

 Floxy07 мар. 2018 г., 11:12
EnsureCreated () работает нормально, но в "context.Database.Migrate ()" нет метода Migrate (), почему это так? EF Core
 Shimmy03 июл. 2019 г., 09:01
Где правильное место, чтобы позвонитьDatabase.Migrate в приложении ASP.NET Core?
 Michael12 мар. 2018 г., 06:45
@ Флокси, я думаю, что ты скучаешьusing Microsoft.EntityFrameworkCore;.
 rad28 июн. 2019 г., 10:41
Это не работает для возврата миграции!
 Floxy12 мар. 2018 г., 13:15
@ Майкл Да !! я забыл упомянуть, что все равно спасибо !! <3

вот как я переношу базу данных. Это обеспечивает разделение задач, связанных с базой данных, наProgram.cs:

    public static void Main(string[] args)
    {
        var host = BuildWebHost(args);

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetService<AppDbContext>();
                context.Database.Migrate();

                var seeder = scope.ServiceProvider.GetService<AppSeeder>();
                seeder.Seed().Wait();
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred seeding the DB.");
            }
        }

        host.Run();
    }

    private static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();

Ваш ответ на вопрос