2017-08-25 41 views
1

DbMigration.SqlFile method需要一個sqlFile參數,該參數需要磁盤上的SQL文件路徑,該路徑在調用該方法時執行。GO允許在傳遞給DbMigration.SqlFile的SQL文件中嗎?

問題

提供給DbMigration.SqlFile方法的sqlFile參數SQL文件允許使用GO關鍵字單獨的SQL語句的多批次?

是否允許GO根據SQL Server版本,實體框架版本,.NET運行時版本或其他因素而有所不同?

全面的背景

我的項目使用實體框架版本6.

我有一個實體框架遷移類從DbMigration繼承這只是運行磁盤上的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

當我的團隊的持續集成服務器上運行他們仍然正常工作(使用Visual Studio 2015和SQL Server 2014)。

然而,截至昨天,當我試圖運行在我的本地環境的遷移(與Visual Studio 2017年和SQL Server 2016),他們失敗,出現錯誤:

Incorrect syntax near 'GO'. 

所以,問題:

  • 是否支持與DbMigration.SqlFile方法一起使用的SQL文件中的GO,還是不支持?
  • 我的本地開發PC和我的團隊的CI服務器之間的相關區別是什麼,導致遷移失敗本地,但在CI中正常工作?
+3

'GO'不是T-SQL命令,它是'sqlcmd'的批處理分隔符和在SSMS中執行的腳本。在任何其他情況下,「GO」將不起作用。特別是,當腳本作爲批處理按原樣傳遞給SQL Server時,「GO」不起作用。這聽起來就像你的設置發生了什麼 - 由於什麼原因我不能說。檢查一些像CR/LF不匹配或不可見字符這樣的奇怪事情,這些字符可能會導致代碼嘗試通過「GO」分隔事物。 –

回答

0

運行單元測試時會出現上述原始文章中描述的問題,因爲項目配置爲使用實體框架遷移來創建並重建測試數據庫(如果缺失),並將其提交給最新的遷移,在運行任何測試方法之前。

問題是Visual Studio中的測試項目(即我們的測試類所在的獨立Visual Studio .csproj)缺少對Entity Framework nuget包的引用。參考文件不知何故被破壞或損壞。

其中一個症狀是在Visual Studio中的Package Manager Console窗口中運行Get-Package時,Entity Framework完全沒有出現在測試項目的引用列表中。

的解決方案是固定在包管理器控制檯窗口中的測試項目實體框架參考

  1. 在「默認項目」下拉列表中,選擇我的測試項目;
  2. 冉:Install-Package EntityFramework

這樣做後,遷移成功運行。 Incorrect syntax near 'GO'錯誤不再發生。