Database.Migrate () создание базы данных, но не таблиц, EF & .NET Core 2 - PullRequest
0 голосов
/ 24 мая 2018

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

Сценарий - мне нужно создать базу данных с нуля и отредактировать ее с миграциями всего кода, согласнодокументация, приведенная ниже, должна создать базу данных из DbContext / ModelBuilder.

_dbContext.Database.Migrate();

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

_dbContext.Database.EnsureCreated();

база данных И все таблицы будут созданы, однако это не вариант, так как мне нужно редактировать с миграциями дальше по линии.Я попробовал приведенный ниже код сразу после строки Migrate, но pendingMigrations всегда равен 0.

var pendingMigrations = _dbContext.Database.GetAppliedMigrations().ToList();
        if (pendingMigrations.Any())
        {
            var migrator = _dbContext.Database.GetService<IMigrator>();
            foreach (var targetMigration in pendingMigrations)
                migrator.Migrate(targetMigration);
        }

Есть ли что-то, что я здесь упускаю?Разве Database.Migrate () не должен создавать таблицы и базу данных?

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

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

В моем случае у меня было несколько проектов, и DesignTimeDbContextFactory указывал на MigrationsAssembly, но при запуске sqlOptions не было.

enter image description here enter image description here

, поэтому, когда DI создает DbContext, он не знает, что существуют ожидающие миграции.

вы можете проверить ожидающие миграции с помощью dbContext.Database.GetPendingMigrations(); перед Migrate();, чтобы проверить, еслиобнаружены миграции или нет

Решение - добавить миграцию MigrationsAssembly в sqlOptions

 services.AddDbContext<BM_OCR_DbContext>(options =>
                {
                    options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection"),
                    sqlServer => sqlServer.MigrationsAssembly("BM.OCR.Server"));
                });
0 голосов
/ 24 мая 2018

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

TLDR - _dbContext.Database.Migrate(); не создает миграций.

По сути, dbContext.Database.EnsureCreated() не заботится о миграциях, поэтомуон сгенерировал полные таблицы базы данных inc (однако тогда, конечно, вы не можете мигрировать).

_dbContext.Database.Migrate(); применяет миграции и создает базу данных, если она не существует, однако не создает таблицы, еслимиграции нет.

По сути, у меня есть проект в качестве ресурса, я пытался продублировать проект из нового приложения, созданного пользователем, но, поскольку я никогда не выполнял никаких миграций в проекте ресурса, ничего не быломигрировать.Выполнение Add-Migration Initial в PMC в проекте ресурсов дало проекту первоначальные файлы миграции, а затем, когда я запустил миграцию в новой базе данных, он знал, какие таблицы создать.

...