"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 修改的影响。
我在使用向 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 修改的影响。