2

我正在使用實體框架版本6的ASP.NET MVC 5 web應用程序。如何避免「OFFSET附近的語法錯誤」。FETCH語句中NEXT選項的使用無效。「

現在我在開發服務器內開發SQL Server 2012上的應用程序。我映射了我的數據庫表,並生成了.edmx模型文件。我的開發服務器上一切正常。

現在,當我部署了我們活的服務器上使用SQL Server 2008的應用程序,我得到了以下異常: -

附近有語法錯誤「偏移」。 FETCH語句中NEXT選項的使用無效。

在我的操作方法中下面的代碼: -

records.Content = await db.SalesDatas.Where(x=> 
       (String.IsNullOrEmpty(currentdomainfilter) || x.EmailDomain.ToLower().Contains(currentdomainfilter.ToLower().Trim())) 
       && 
       (String.IsNullOrEmpty(currentgatewayfilter) || x.EmailGateway.ToLower().Contains(currentgatewayfilter.ToLower().Trim())) 
       ).OrderBy(sort + " " + sortdir) 
        .Skip((page - 1) * pageSize.Value) 
        .Take(pageSize.Value).ToListAsync(); 

我發現這個鏈接,說明問題以及如何解決它http://erikej.blogspot.ro/2014/12/a-breaking-change-in-entity-framework.html

所以我做了我的ASP.NET MVC項目中的以下內容:

  1. 我編輯.edmx文件。
  2. 我改變的ProviderManifestToken值2012年至2008年

現在我的應用程序的SQL Server 2012和SQL Server上的工作以及2008年

我的問題是修補程序應用是否是正確的方法或者它是一種解決方法。我的意思是,如果底層SQL Server版本是2012,那麼我是否可以強制.edmx應用OFFSET..FETCH,並且如果SQL Server版本是2008,則可以避免這種情況?我遵循的方法解決了這個問題(將2012年的值改爲ProviderManifestToken),我將消除SQL Server 2012中的任何新功能(例如使用OFFSET..FETCH),並讓我的.edmx僅使用可用功能在2008 ..

+1

目前是解決此問題的唯一方法 - 您必須將ProviderManifestToken設置爲EF所需的最低SQL Server版本。 –

+0

IMO您應該切換到基於密鑰的分頁,而不是依靠常規分頁。假設頁面的結尾是'X'鍵,並且頁面中有'Y'行,那麼下一頁是'SELECT TOP Y ... FROM

WHERE key> X'。不知道如何轉化爲ASP.NET,但我只能說這個問題的SQL Server角度。 –

+1

'.edmx'文件是在編譯時建立的,這意味着你不能在運行時改變這種行爲。 **如果您希望支持多個SQL Server版本,則必須爲每個您希望支持的SQL Server版本創建一個發行包。這將涉及在每次編譯之前將'ProviderManifestToken'更新爲適當的版本,並將正確版本部署到客戶端/服務器。你*可以*也可以處理這與多個代碼分支,每個SQL服務器版本(*這將是一個PITA IMO *)。 – Igor

回答

3

.edmx文件內容是在編譯時生成的,這意味着您不能在運行時更改此行爲。

這意味着你有2個選擇。

  1. 指向想要使用的最低Sql Server版本,因爲在註釋中已指出@marc_s。這是你已經使用的解決方案,它不是一個解決方法,但只是它的工作方式。
  2. 如果您希望在您的應用程序中支持多個Sql Server版本,您將不得不爲每個想要支持的Sql Server版本創建1個發行包。如果.edmx文件包含在單獨的項目中,或者如果您只有一個MVC項目,則可能是整個應用程序,如果發行包可以替代dll。這將涉及在每次編譯之前將ProviderManifestToken更新爲適當的版本,並將正確版本部署到客戶端/服務器。
+0

所以主要我需要有兩個版本的edmx一個用於sql 2012,而另一個用於2008? –

+1

@johnG - 這取決於你想如何管理變化。您可以使用構建腳本在編譯時更改該值(如果必須這樣做,這將是我的選擇)。你也可以有2個.edmx文件,你可以保持同步,儘管這需要大量的維護和其他問題,比如代碼如何知道使用哪個文件。 – Igor

+1

@johnG - 我會將.edmx保存在一個單獨的項目中,並編譯它的兩個版本(*再次使用構建腳本)*。然後,您可以根據環境部署正確的.DLL作爲部署的一部分。 – Igor