2015-10-02

[筆記]讓新版EF6的Skip、Take語法支援SQL Server 2008

最近在寫一個簡單MVC專案,有用到分頁,在本機測試時,分頁一切正常,但是發佈到遠端Server時,竟然出現底下錯誤:「接近 OFFSET 之處的語法不正確。FETCH 陳述式中的選項 NEXT 使用方式無效


覺得奇怪,到底花生省魔術?


原本以為是PageList套件的問題,後來單純地用Skip與Take函數也是不行!因為錯誤訊息沒列出產生的SQL,所以用SQL Profiler查了一下跑出來的語法如下:

重點就是在紅框的語法,OFFSET指令是從2012版之後才加入的,本機開發使用的localDB,是2014版本,所以在本機測試執行沒問題。但遠端主機的SQL Server是2008 R2,不支援OFFSET語法(可看到OFFSET是黑色,並非藍色關鍵字),難怪會報錯囉!

所以只要把EF的SQL Server版本調成2008就可以了!我們如果用DB First或是Model First,應該都會產生EDMX檔案,但直接點兩下會是以圖形方式顯示,所以我們在edmx檔按右鍵,選擇「開啟方式...」

然後選擇「XML(文字)編輯器」,即可以文字方式開啟這個檔案。


在檔案中找到「ProviderManifestToken」這個屬性,可看到預設值是2012,我們把它改成2008,然後存檔,這樣執行就沒問題囉!