Update-Database 生成的脚本有语法错误,而正常的 Update-Database 可以正常工作

Script generated by Update-Database has syntax errors while a normal Update-Database works correctly

我有一个 .NET Framework 4.8 项目,使用 Entity Framework 6.2.0 进行多次迁移。我的问题是,当我从我的本地计算机上删除我的数据库并且 运行 Update-Database 数据库创建成功时,但是当我 运行 Update-Database -Script 命令并保存我的 SQL 脚本,然后 运行 SQL 脚本与

Invoke-Sqlcmd -InputFile ".\build\artifacts\migration.sql" -ServerInstance "(localdb)\MSSQLLocalDB"

我遇到很多语法错误,例如

Invoke-Sqlcmd : 'CREATE/ALTER PROCEDURE' must be the first statement in a query batch.

A RETURN statement with a return value cannot be used in this context.

为什么会出现这些错误? 如何解决它们?为什么正常的 update-database 可以正常工作,但 SQL 脚本有语法错误?

我认为adding 'GO' statements to Entity Framework migrations稍加修改就可以解决我的问题。

正如我们所知,如您所见SQL Server - Must be first statement in query batch - what and why?

来自http://msdn.microsoft.com/en-us/library/ms175502(v=sql.105).aspx

Rules for Using Batches

The following rules apply to using batches:

  • CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, CREATE SCHEMA, CREATE TRIGGER, and CREATE VIEW statements cannot be combined with other statements in a batch. The CREATE statement must start the batch. All other statements that follow in that batch will be interpreted as part of the definition of the first CREATE statement.
  • A table cannot be changed and then the new columns referenced in the same batch.
  • If an EXECUTE statement is the first statement in a batch, the EXECUTE keyword is not required. The EXECUTE keyword is required if the EXECUTE statement is not the first statement in the batch.

问题是当我们生成脚本而不是直接使用 Update-Database 时,所有迁移都希望在批处理中 运行 并且当我们有一些手工制作的 SQL 脚本时会导致一些错误在违反 SQL 规则的迁移中。

所以要解决这个问题,我们必须在语句的开头添加 /**/ GO。 (感谢 Ivan Stus

感谢Larnu帮我调查问题。