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項目中的以下內容:
- 我編輯
.edmx
文件。 - 我改變的
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 ..
目前是解決此問題的唯一方法 - 您必須將ProviderManifestToken設置爲EF所需的最低SQL Server版本。 –
IMO您應該切換到基於密鑰的分頁,而不是依靠常規分頁。假設頁面的結尾是'X'鍵,並且頁面中有'Y'行,那麼下一頁是'SELECT TOP Y ... FROM
'.edmx'文件是在編譯時建立的,這意味着你不能在運行時改變這種行爲。 **如果您希望支持多個SQL Server版本,則必須爲每個您希望支持的SQL Server版本創建一個發行包。這將涉及在每次編譯之前將'ProviderManifestToken'更新爲適當的版本,並將正確版本部署到客戶端/服務器。你*可以*也可以處理這與多個代碼分支,每個SQL服務器版本(*這將是一個PITA IMO *)。 – Igor
回答
.edmx
文件內容是在編譯時生成的,這意味着您不能在運行時更改此行爲。這意味着你有2個選擇。
.edmx
文件包含在單獨的項目中,或者如果您只有一個MVC項目,則可能是整個應用程序,如果發行包可以替代dll
。這將涉及在每次編譯之前將ProviderManifestToken
更新爲適當的版本,並將正確版本部署到客戶端/服務器。來源
2017-10-23 14:54:21 Igor
所以主要我需要有兩個版本的edmx一個用於sql 2012,而另一個用於2008? –
@johnG - 這取決於你想如何管理變化。您可以使用構建腳本在編譯時更改該值(如果必須這樣做,這將是我的選擇)。你也可以有2個.edmx文件,你可以保持同步,儘管這需要大量的維護和其他問題,比如代碼如何知道使用哪個文件。 – Igor
@johnG - 我會將.edmx保存在一個單獨的項目中,並編譯它的兩個版本(*再次使用構建腳本)*。然後,您可以根據環境部署正確的.DLL作爲部署的一部分。 – Igor
相關問題