Мы используем миграцию 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 и успешно обновляю ее в базе данных. Но когда я добавляю новый шаг миграции, он жалуется, что задача, которая была только что «зафиксирована» в базе данных, все еще «ожидает выполнения», хотя и история миграции, и объекты базы данных были обновлены.