EFCore: миграции и первоначальное создание БД - PullRequest
0 голосов
/ 23 октября 2019

Я использую EFCore (недавно перенесенный из EF) для создания БД с кодом и кодированных миграций. EFCore обновляет моментальный снимок модели контекста всякий раз, когда я создаю новую миграцию. Поэтому, когда я создаю новую БД с нуля, используя

using (var db = new AudmDatabaseContext())
{
    if (!db.Database.GetService<Microsoft.EntityFrameworkCore.Storage.IRelationalDatabaseCreator>().Exists())
    {
        db.Database.EnsureCreated();
    }
}

, у меня есть текущая структура БД. Однако, когда у меня есть существующая система, мне нужно запустить миграцию

using (var db = new AudmDatabaseContext())
{
    if (db.Database.GetService<Microsoft.EntityFrameworkCore.Storage.IRelationalDatabaseCreator>().Exists())
    {
            var pendingMigrations = db.Database.GetPendingMigrations();
            if (pendingMigrations.Count() > 0)
            {
                db.Database.Migrate();
             }
         }
     }
}

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

Так какой здесь рекомендуемый подход? Мне нужно иметь возможность создавать новые БД для новых установок моего программного обеспечения, и мне нужно иметь возможность миграции (поэтому я фактически настроил свое приложение для автоматического выполнения миграций при запуске, чтобы никогда не пропустить какие-либо изменения).

Самое очевидное, что приходит на ум, - это иметь какой-то флаг, который говорит мигратору запускать миграции, но на самом деле не выполняет никакого кода sql при первоначальном создании, так что вновь созданная БД уже, по-видимому, будет полностью перенесена вМигратор ... и когда в какой-то более поздний момент у меня появятся новые ожидающие миграции, будут выполняться только те новые ожидающие миграции, которые были добавлены в код с момента создания начальной БД.

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

...