C# 在传递到DbMigration.SqlFile的SQL文件中是否允许GO?

C# 在传递到DbMigration.SqlFile的SQL文件中是否允许GO?,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,采用sqlFile参数,该参数期望磁盘上SQL文件的路径,该路径在调用该方法时执行 问题 提供给DbMigration.SqlFile方法的SqlFile参数的SQL文件是否允许使用GO关键字分隔多批SQL语句 是否允许GO取决于SQL Server版本、实体框架版本、.NET运行时版本或任何其他版本 完整背景 我的项目使用的是实体框架版本6 我有一个实体框架迁移类继承自该类,仅在磁盘上运行SQL文件,例如: public override void Up() { this.SqlFil

采用
sqlFile
参数,该参数期望磁盘上SQL文件的路径,该路径在调用该方法时执行

问题

提供给DbMigration.SqlFile方法的
SqlFile
参数的SQL文件是否允许使用
GO
关键字分隔多批SQL语句

是否允许
GO
取决于SQL Server版本、实体框架版本、.NET运行时版本或任何其他版本

完整背景

我的项目使用的是实体框架版本6

我有一个实体框架迁移类继承自该类,仅在磁盘上运行SQL文件,例如:

public override void Up()
{
    this.SqlFile("/sql/StoredProcedures/MyMigrationFile.sql");
}
该文件的内容如下所示:

DROP PROCEDURE [dbo].[MyStoredProcedure]
GO

CREATE PROCEDURE [dbo].[MyStoredProcedure]
  @MyParameter int
AS
  [Stored procedure SQL body here...]
事实上,我的项目有几十个这样的迁移类和SQL文件,至少从2016年1月起,它们工作得很好

在我的团队的持续集成服务器(使用Visual Studio 2015和SQL server 2014)上运行时,它们仍然可以正常工作

但是,截至昨天,当我尝试在本地环境(使用Visual Studio 2017和SQL Server 2016)中运行这些迁移时,它们失败了,错误如下:

Incorrect syntax near 'GO'.
因此,问题是:

  • 与DbMigration.SqlFile方法一起使用的SQL文件是否支持
    GO
  • 我的本地开发PC和我的团队的CI服务器之间的相关区别是什么,导致迁移在本地失败,但在CI中工作正常

在运行单元测试时会出现上述原始帖子中描述的问题,因为项目被配置为使用实体框架迁移来创建和重建测试数据库(如果缺少),并在运行任何测试方法之前将其更新为最新的迁移

问题是VisualStudio中的测试项目(即我们的测试类所在的单独的VisualStudio.csproj)缺少对Entity Framework nuget包的引用。参考资料不知何故被破坏或损坏了

这种情况的一个症状是,当从VisualStudio中的包管理器控制台窗口运行
Get Package
时,实体框架根本没有出现在测试项目的引用列表中

解决方案是通过以下方式修复Package Manager控制台窗口中测试项目的实体框架引用:

  • 在“默认项目”下拉列表中,选择我的测试项目
  • 运行:
    安装程序包EntityFramework

  • 完成后,迁移成功运行。“GO”附近的
    错误语法不再出现。

    在运行单元测试时,会出现上面原始帖子中描述的问题,因为项目配置为使用实体框架迁移来创建和重建缺少的测试数据库,并将其更新为最新迁移,在运行任何测试方法之前

    问题是VisualStudio中的测试项目(即我们的测试类所在的单独的VisualStudio.csproj)缺少对Entity Framework nuget包的引用。参考资料不知何故被破坏或损坏了

    这种情况的一个症状是,当从VisualStudio中的包管理器控制台窗口运行
    Get Package
    时,实体框架根本没有出现在测试项目的引用列表中

    解决方案是通过以下方式修复Package Manager控制台窗口中测试项目的实体框架引用:

  • 在“默认项目”下拉列表中,选择我的测试项目
  • 运行:
    安装程序包EntityFramework

  • 完成后,迁移成功运行。“GO”附近的
    语法错误
    错误不再发生。

    GO
    不是T-SQL命令,它是在SSMS中执行的
    sqlcmd
    和脚本的批处理分隔符。在任何其他上下文中,
    GO
    都不起作用。具体地说,当脚本作为批处理传递给SQL Server时,
    GO
    将不起作用。听起来这正是你的设置所发生的事情——我不知道是什么原因。检查一些古怪的东西,如CR/LF不匹配或不可见的字符,这些字符可能会使试图通过
    GO
    GO
    来分隔事物的代码出错
    GO
    不是T-SQL命令,它是
    sqlcmd
    和在SSMS中执行的脚本的批处理分隔符。在任何其他上下文中,
    GO
    都不起作用。具体地说,当脚本作为批处理传递给SQL Server时,
    GO
    将不起作用。听起来这正是你的设置所发生的事情——我不知道是什么原因。检查一些古怪的东西,如CR/LF不匹配或不可见字符,这些字符可能会使试图通过
    GO
    来分隔事物的代码出错。