Как использовать автоматическую миграцию в Entity Framework Core 2 - PullRequest
1 голос
/ 28 октября 2019

Я использую ядро ​​Entity Framework 2. Я видел сообщения в переполнении стека, но не могу решить мою проблему. Я хочу использовать автоматическую миграцию в моем проекте без консольной команды.

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Попробуйте этот код:

using (var serviceScope = _scopeFactory.CreateScope())
{
    using (var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>())
    {
        context.Database.Migrate();
    }
}

Полный код:

public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();
        host.Services.InitializeDb();
        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args)
    {//Add Code }
    }
}
public interface IDbInitializer
{
    void Initialize();
}
public class DbInitializer : IDbInitializer
{
    private readonly IServiceScopeFactory _scopeFactory;

    public DbInitializer(IServiceScopeFactory scopeFactory)
    {
        _scopeFactory = scopeFactory;
    }
    public void Initialize()
    {
        using (var serviceScope = _scopeFactory.CreateScope())
        {
            using (var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>())
            {
                context.Database.Migrate();
            }
        }
    }
}
public static class DbContextOptionsExtensions
{
    public static void InitializeDb(this IServiceProvider serviceProvider)
    {
        var scopeFactory = serviceProvider.GetRequiredService<IServiceScopeFactory>();
        using (var scope = scopeFactory.CreateScope())
        {
            var dbInitialize = scope.ServiceProvider.GetRequiredService<IDbInitializer>();
            dbInitialize.Initialize();
        }
    }
}
0 голосов
/ 29 октября 2019

EF core не поддерживает автоматическую миграцию. Так что вам придется делать это вручную.

С точки зрения автоматической миграции как функции, мы не планируем внедрять ее в EF Core, так какопыт показывает, что переходы на основе кода являются более управляемым подходом.

Полный текст статьи можно прочитать здесь: Не реализовывать автоматические миграции

Есть 2методы в EF Core, связанные с миграцией. Database.Migrate() и Database.EnsureCreated(). Ни одна из них не является полной миграцией.

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

EnsureCreated() создает базу данных на основе моделей в проекте. Но это не делает это путем миграции. На самом деле никаких миграций не требуется с помощью этого метода. Недостатком этого метода является то, что созданная им база данных не может быть обновлена ​​в будущем при каких-либо миграциях. Не звоните EnsureCreated() до Migrate(). EnsureCreated() обходит Миграции для создания схемы, что приводит к сбою Migrate().

Вывод: сначала добавьте миграцию, а затем обновите базу данных (Database.Migrate ())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...