2016-01-14 2 views
2

Почему это не работает?Entity Framework Migrations пользовательский SQL не работает

AddColumn("dbo.Bins", "Code", c => c.String()); 
//custom copy data from old BinCode column 
Sql("UPDATE Bins SET Code = BinCode WHERE BinCode IS NOT NULL"); 
DropColumn("dbo.Bins", "BinCode"); 

Бункеры имеет Bin.BinCode с множеством значений, когда я запускаю это внутри DbMigration я считаю, что Bin.Code является NULL.

EDIT: Я на самом деле не запустить Update-Database в консоли менеджера пакетов, но я выполняю от моего блока источника работы:

 Database.SetInitializer<eVendContext>(new MigrateDatabaseToLatestVersion<eVendContext, Configuration>()); 

Edit 2: Просто для уточнения, База данных успешно обновляется до последней миграции. Простые данные не копируются из поля BinCode в поле Code при завершении.

Edit 3: Вот соответствующий выход из -verbose Update-базы данных:

ALTER TABLE [dbo].[Bins] ADD [Code] [nvarchar](max) 
UPDATE Bins SET Bins.Code = BinCode WHERE BinCode IS NOT NULL 
DECLARE @var0 nvarchar(128) 
SELECT @var0 = name 
FROM sys.default_constraints 
WHERE parent_object_id = object_id(N'dbo.Bins') 
AND col_name(parent_object_id, parent_column_id) = 'BinCode'; 
IF @var0 IS NOT NULL 
    EXECUTE('ALTER TABLE [dbo].[Bins] DROP CONSTRAINT [' + @var0 + ']') 
ALTER TABLE [dbo].[Bins] DROP COLUMN [BinCode] 

Когда я запускаю этот вывод многословен на моей базе данных в качестве полного сценария, я получаю ошибку «недопустимое имя столбца ' Код'". Но каждый оператор, в свою очередь, обновляет мою базу данных, как и следовало ожидать.

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

+0

Что такое ошибка? –

+0

Отсутствие ошибки или исключения, данные не переносятся из старого столбца в новый столбец. – Smithy

+0

Вы действительно выполнили команду «Обновить-База данных» в консоли диспетчера пакетов? –

ответ

1

Попробуйте что-то подобное в вашей миграции Seed(), которая будет выполняться после добавления колонки:

if (context.Bins.Any(b => b.Code == null && b.BinCode != null) 
{ 
    context.Database.ExecuteSQLCommand("UPDATE Bins SET Code = BinCode WHERE BinCode IS NOT NULL"); 
} 
0

Попробуйте это:

Sql("UPDATE Bins SET Bins.Code = Bins.BinCode WHERE Bins.BinCode IS NOT NULL"); 
+0

Не работает, похоже на то, что я должен быть честным. – Smithy

3

Try:

Sql("UPDATE Bins SET Code = BinCode WHERE BinCode IS NOT NULL", true); 

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

+0

Нет, уже пробовал это. Я могу видеть, откуда вы пришли, но мне также нужно будет выполнить AddColumn как подавленную транзакцию (для которой у нее нет перегрузки) – Smithy

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