"Invalid column name" 次 Entity Framework 次迁移

"Invalid column name" with Entity Framework migrations

我在使用向 table 添加列并为其赋值的迁移来更新数据库时遇到问题。我已将问题简化为一个非常简单的案例。

这是模型:

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

我修改了该迁移以更新 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, Level 16, State 1, Line 2 Invalid column name 'Col3'.

生成的脚本是:

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

显然,SQL 服务器无法处理批量更改 table 和更新。

我试图在两者之间添加 SQL("GO");,但这导致错误:

The argument 'sql' cannot be null, empty or contain only white space.

尝试更新时。

如何使用迁移来实现这一点。我希望我的 Up() 和 Down() 方法能够持续更新数据库。

我通过添加虚拟 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 服务器接受,并且更改会按原样应用。

@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 修改的影响。