【问题标题】:Entity Framework migration AddColumn(), followed by Sql(@"Update of that columnEntity Framework迁移AddColumn(),后跟Sql(@"更新该列
【发布时间】:2015-06-30 00:36:56
【问题描述】:

鉴于此迁移:

public override void Up()
{
    AddColumn("dbo.ClientData", "ExFirstName", c => c.String(maxLength: 2));
    Sql(@"UPDATE [ClientData]
            SET ExFirstName = LEFT(EX,2)
          WHERE RandomEX = 0
            AND LEN(EX) = 8");

然后我生成迁移作为 sql 脚本提供给 dba

ALTER TABLE [dbo].[ClientData] ADD [ExFirstName] [nvarchar](2)
UPDATE [ClientData]
                SET ExFirstName = LEFT(EX,2)
              WHERE RandomEX = 0
                AND LEN(EX) = 8

然后在运行时它在 UPDATE 上失败,因为 ALTER TABLE 后面没有“GO”。

这是确切的错误: 消息 207,级别 16,状态 1,服务器 MYSERVER\SQLSVR,第 34 行 列名“ExFirstName”无效。

我通过在带和不带 GO 的 ssms 中运行上面的 sql 确认了这一点。

在代码中运行迁移时:

      if (RunEFMigrations(dataSource))
    {
        var efConfiguration = new NEX.Data.Migrations.Configuration();
        var migrator = new DbMigrator(efConfiguration);
        migrator.Update();
    }

迁移工作正常。

除了将上述迁移和我的其他 80 多个 EF 迁移分成两个 EF 迁移之外,我是否在 EF 配置或 SQL Server 中还有其他选项?

【问题讨论】:

  • 我不认为有任何现成的解决方案,因为 MSSS Name Resolution 就是这样设计的。检查这个:blog.sqlauthority.com/2008/07/15/…
  • 我认为 AddColumn 可以调整,以便在每次通话结束时生成 Go 命令。但是当您不想为您的 DBA 生成脚本(即您想在本地工作)时,您必须关闭此功能。如果你愿意,我可以为你提供这个(有点讨厌但有效)的解决方案

标签: sql-server entity-framework


【解决方案1】:

我最终实现了Test Column exists, Add Column, and Update Column的答案

通过使用 EXEC sp_executesql 包装更新语句

   EXEC sp_executesql
        N'UPDATE [dbo].[PurchaseOrder] SET [IsDownloadable] = 1 WHERE [Ref] IS NOT NULL'

【讨论】:

    猜你喜欢
    • 2016-05-08
    • 2011-11-29
    • 1970-01-01
    • 2021-07-26
    • 2019-01-28
    • 1970-01-01
    • 2012-09-12
    • 2015-11-07
    • 2017-10-27
    相关资源
    最近更新 更多