2016-01-20 2 views
3

Я пытаюсь создать служебный вызов, который обновит первую базу данных EF-кода до последней версии. Тем не менее, он всегда пытается (и явно не выполняет) выполнение всех миграций, независимо от того, были ли они выполнены или нет.DbMigrator пытается выполнить каждую миграцию, не обнаруживая выполненные миграции

Вот мой код:.

 var config = new DbMigrationsConfiguration<MyContext>(); 
     config.MigrationsAssembly = typeof (MyContext).Assembly; 
     config.MigrationsNamespace = "Context.Migrations"; 

     //This had no effect 
     //config.SetHistoryContextFactory(connectionString.ProviderName, (connection, s) => new HistoryContext(context.Database.Connection, "dbo")); 
     var migrator = new DbMigrator(config); 

     //This gets every single migration, even the ones already executed before 
     var migrations = migrator.GetPendingMigrations(); 
     //This gets 0 migrations 
     var existing = migrator.GetDatabaseMigrations(); 
     //This gets all migrations 
     var other = migrator.GetLocalMigrations(); 

     //This returns true! So it knows all the migrations are already executed 
     var differ = context.Database.CompatibleWithModel(true); 
     //This will throw an exception because it's trying to create existing tables! 
     migrator.Update(); 

Я могу подтвердить, что таблица истории миграции содержит [DBO] [__ MigrationHistory] ссылается на все старые миграции.

Я проверил строки подключения в мигрите. Я также попытался установить фабрику контекста истории вручную, если он ищет где-то еще без результата. Кроме того, работает обновление базы данных непосредственно из консоли и не сообщает ожидающих обновлений.

Любая помощь приветствуется

ответ

4

Удостоверьтесь, что DbMigrationsConfiguration.ContextKey настроен правильно.

Значение по умолчанию после этой строки

var config = new DbMigrationsConfiguration<MyContext>(); 

будет как этот

"System.Data.Entity.Migrations.DbMigrationsConfiguration`1[MyContextNamespace.MyContext]" 

Вы должны добавить следующую строку

config.ContextKey = "{Your_Context_Key}"; 

Если вы не знаете, контекст , откройте таблицу [dbo].[__MigrationHistory] и посмотрите на столбец ContextKey.

После того, как вы правильно настроили, если ваша база данных обновлена, migrator.GetPendingMigrations() должен возвращать пустой и migrator.GetDatabaseMigrations() должен возвращать все миграции.

+2

Вот оно! Ваши баллы прибудут через ~ 21 час, когда мне будет разрешено их одобрить. –

+1

Tbh Я отказался и изменил всю свою процедуру. Большое спасибо за это! – Charbel

-1

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

enable-migrations 

Я делаю это все время, когда миграция испортится. Мне никогда не нужны исторические миграции - как только они выполнили свою работу - они СОВЕРШЕННО! Не забудьте сохранить свой метод семени, если вы просматриваете конфигурацию. Вы можете взглянуть на мой предыдущий пост, возможно, это тоже поможет.

Migrations

удачи.

+0

Спасибо за ваш ответ. Мы всегда настраиваем новый экземпляр одной базы данных, поэтому удаление старых миграций не является опцией. – Charbel

+0

После того как вы внесли изменения в базу данных, новый экземпляр будет настроен как последняя форма при включении миграции снова. При включении миграции миграция дает вам скрипт с последней конечной формой данных, используйте этот скрипт для настройки ваших новых экземпляров одной и той же базы данных. Это будет похоже на запуск окончательного моментального снимка всех старых старых сценариев. Вы получите свою окончательную базу данных. Затем начните развиваться снова и добавьте к нему. – alikuli

+1

«Если ваша база данных обновлена»: проблема афера заключается в том, что база данных не может быть обновлена. –

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