Не удалось сгенерировать явную миграцию (EF5) (миграции ожидаются)

Мы используем миграцию Code-first с EF5 на (localdb)\v11.0 (Vstudio 2012), и до сих пор все работало хорошо.

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

Сначала я сделал это в личке:

PM> add-migration AddIdxToOutage
Scaffolding migration 'AddIdxToOutage'.

Я изменил код миграции с помощью шаблонов на:

public override void Up()
        {
            Sql(@"CREATE NONCLUSTERED INDEX [idx_WtgId_StartDateTime_EndDateTime] ON [dbo].[Outages]
(
    [WtgId] ASC,
    [StartDateTime] ASC,
    [EndDateTime] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]");
        }

Я обновил базу данных, и результат был таким:

PM> update-database -startupprojectname D3A.Data -force -verbose
Using StartUp project 'D3A.Data'.
Using NuGet project 'D3A.Data'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'D3A.Data.StorageContext' (DataSource: (localdb)\v11.0, Provider: System.Data.SqlClient, Origin: Convention).
Applying code-based migrations: [201310301258520_AddIdxToOutage].
Applying code-based migration: 201310301258520_AddIdxToOutage.
CREATE NONCLUSTERED INDEX [idx_WtgId_StartDateTime_EndDateTime] ON [dbo].[Outages]
(
    [WtgId] ASC,
    [StartDateTime] ASC,
    [EndDateTime] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
[Inserting migration history record]
Running Seed method.

idx был создан на столе, и все были счастливы.

Однако при создании следующего индекса я столкнулся с проблемами. Я создал пустую задачу миграции как

PM> add-migration AddIdxToState
Unable to generate an explicit migration because the following explicit migrations are pending: [201310301258520_AddIdxToOutage]. Apply the pending explicit migrations before attempting to generate a new explicit migration.

Простите мой французский - но WT*?

Кажется, нет никакого способа обойти это. Я могу вернуться к шагу миграции, предшествующему добавлению первого idx, снова добавить idx, и снова произойдет то же самое.

Можете ли вы сказать мне, что мне здесь не хватает? Что я делаю не так?

Изменить:

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

Я только что добавил новую таблицу в базу данных, и это стандартный результат из PM Console:

PM> add-migration AddMyLoggerTable
Scaffolding migration 'AddMyLoggerTable'.
The Designer Code for this migration file includes a snapshot of your current Code First model. This snapshot is used to calculate the changes to your model when you scaffold the next migration. If you make additional changes to your model that you want to include in this migration, then you can re-scaffold it by running 'Add-Migration 201310301419063_AddMyLoggerTable' again.
PM> update-database -startupproject DongEnergy.D3A.Data -verbose
Using StartUp project 'D3A.Data'.
Using NuGet project 'D3A.Data'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'D3A.Data.StorageContext' (DataSource: (localdb)\v11.0, Provider: System.Data.SqlClient, Origin: Convention).
Applying code-based migrations: [201310301419063_AddMyLoggerTable].
Applying code-based migration: 201310301419063_AddMyLoggerTable.
CREATE TABLE [dbo].[MyLoggerTable] (
    [id] [int] NOT NULL,
    [functionId] [int],
    [elapsedTime] [bigint],
    [noOfRecords] [int],
    [dateCreated] [datetime] DEFAULT getDate()
)
[Inserting migration history record]
Running Seed method.
PM> add-migration AddMyLoggerTableFunction
Unable to generate an explicit migration because the following explicit migrations are pending: [201310301419063_AddMyLoggerTable]. Apply the pending explicit migrations before attempting to generate a new explicit migration.

Обратите внимание, как я добавляю новую пустую задачу миграции, использую метод CreateTable и успешно обновляю ее в базе данных. Но когда я добавляю новый шаг миграции, он жалуется, что задача, которая была только что «зафиксирована» в базе данных, все еще «ожидает выполнения», хотя и история миграции, и объекты базы данных были обновлены.


person Jesper Lund Stocholm    schedule 30.10.2013    source источник
comment
Попробуйте: отменить, удалить миграцию и создать ее заново. Пару раз у меня были проблемы с пустыми миграциями, но этот простой трюк всегда срабатывал.   -  person Alexandre Rondeau    schedule 30.10.2013
comment
@allo_man, ну, я попробовал это. Я вернулся к шагу миграции /до/ создания индекса. Это работало нормально. Затем я добавил первый шаг для создания index. Это сработало нормально, и база данных обновлений работает так, как предполагалось. Когда я добавляю миграцию для создания второго индекса, это не удается.   -  person Jesper Lund Stocholm    schedule 30.10.2013
comment
Ваша первая миграция создала свою запись в таблице __MigrationHistory?   -  person Adrian    schedule 23.01.2014


Ответы (3)


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

Мое решение состояло в том, чтобы запустить мое приложение, чтобы ожидающие миграции могли обновить базу данных. Приложение автоматически обновляет базу данных с помощью MigrateDatabaseToLatestVersion. Это также можно сделать, введя Update-Database в консоли диспетчера пакетов.

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

Код конструктора для этого файла миграции включает снимок вашей текущей модели Code First. Этот моментальный снимок используется для расчета изменений в вашей модели при создании шаблона следующей миграции. Если вы вносите дополнительные изменения в свою модель, которые хотите включить в эту миграцию, вы можете создать ее повторно, запустив «Add-Migration [Timestamp]_MigrationName» еще раз .

Другими словами, запустите инструмент Add-Migration с тем же идентификатором, что и отложенная операция, и новые изменения будут объединены со старыми. Если вы заметили, что изменения не объединяются, вы можете использовать флаг -F (как в Add-Migration <Name> -Force) для принудительной миграции, как отмечает anthony-arnold в комментариях.

person Patrick    schedule 30.01.2014
comment
Используй -Force, Люк. - person Anthony; 06.02.2014

Другая возможная причина: если у вас есть разные проекты в решении, такие как UI и Core (ваша конфигурация базы данных здесь), убедитесь, что во время миграции ваш основной проект установлен как запускаемый проект. Это решило мою проблему. Удачного кодирования :)

person Mayeed    schedule 11.06.2015

На всякий случай, если кому-то интересно, я столкнулся с ошибкой "Невозможно сгенерировать явную миграцию, поскольку ожидаются следующие явные миграции..." после того, как я изменил значение ContextKey в файл Configuration.cs. Я поменял обратно и проблема исчезла.

person Matt    schedule 22.05.2015
comment
Так было и с моим проектом. Вместо того, чтобы изменить ContextKey обратно, я вручную настроил его на новое значение в таблице _MigrationHistory в базе данных. Это тоже решило проблему. - person Tobias Ramforth; 18.06.2015