«Неверное имя столбца» с миграциями Entity Framework - PullRequest
0 голосов
/ 12 июня 2018

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

Вот модель:

public class Model
{
    public int Id { get; set; }

    public int Col2 { get; set; }
}

Это контекст:

public class Context : DbContext
{
    public DbSet<Model> Models { get; set; }
}

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

PM> Enable-Migrations
PM> Add-Migration -Name Initial
PM> Update-Database

Затем я расширил свою модель:

public int Col3 { get; set; }

и создал новую миграцию:

PM> Add-Migration -Name AddedCol3

Iизменил эту миграцию, чтобы обновить значения в Col3, см. вызов Sql ():

public override void Up()
{
    AddColumn("dbo.Models", "Col3", c => c.Int(nullable: false));
    Sql("update dbo.Models set Col3 = Col2");
}

public override void Down()
{
   DropColumn("dbo.Models", "Col3");
}

Когда я обновляю базу данных этой миграцией, я получаю:

Msg 207, Уровень 16, Состояние 1, Строка 2 Неверное имя столбца 'Col3'.

Сгенерированный сценарий:

ALTER TABLE [dbo].[Models] ADD [Col3] [int] NOT NULL DEFAULT 0
update dbo.Models set Col3 = Col2
-- Removed update to migration history.

Очевидно, что SQL Server не может обработать таблицу изменений и обновитьв одной партии.

Я попытался добавить SQL("GO"); между ними, но это приводит к ошибке:

Аргумент 'sql' не может быть нулевым, пустым или содержать только белыйпробел.

при попытке обновления.

Как использовать миграции для достижения этой цели.Я хочу, чтобы методы Up () и Down () постоянно обновляли базу данных.

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

Обход, предоставляемый @scsimon, переводит в SQL-оператор

Sql("EXEC('update dbo.Models set Col3 = Col2')");

и скрипт

ALTER TABLE [dbo].[Models] ADD [Col3] [int] NOT NULL DEFAULT 0
EXEC('update dbo.Models set Col3 = Col2')

и работает нормально.

Я предпочитаю этометод, как я ожидаю, будет менее уязвимым для модификаций EF.

0 голосов
/ 12 июня 2018

Я нашел обходной путь, добавив фиктивный SQL-оператор:

Sql("select 1\nGO");

Получившийся скрипт:

ALTER TABLE [dbo].[Models] ADD [Col3] [int] NOT NULL DEFAULT 0
GO

select 1

update dbo.Models set Col3 = Col2

Обратите внимание, что оператор GO автоматически былперемещено в другое место!

В любом случае, сценарий теперь принят SQL Server, и изменения применяются так, как они были добавлены.

...