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中工作正常
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
来分隔事物的代码出错。