如何避免 "Incorrect syntax near 'OFFSET'. Invalid usage of the option NEXT in the FETCH statement."

How to avoid the "Incorrect syntax near 'OFFSET'. Invalid usage of the option NEXT in the FETCH statement."

我正在开发一个 ASP.NET MVC 5 Web 应用程序,它使用 Entity Framework 版本 6。

现在我在我的开发服务器中的 SQL Server 2012 上开发应用程序。我映射了我的数据库表并生成了 .edmx 模型文件。在我的开发服务器上一切正常。

现在,当我在使用 SQL Server 2008 的实时服务器上部署应用程序时,出现以下异常:-

Incorrect syntax near 'OFFSET'. Invalid usage of the option NEXT in the FETCH statement.

我的操作方法中的以下代码:-

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();

我发现这个 link 描述了问题以及如何解决它 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 服务器版本为 2012,有没有一种方法可以强制 .edmx 应用 OFFSET..FETCH,如果 SQL 服务器版本为 2008,则可以避免这种情况?我采用的解决此问题的方法(将 ProviderManifestToken 的值从 2012 更改为 2008),我将消除 SQL Server 2012 中发现的任何新功能(例如使用 OFFSET..FETCH),并让我的 .edmx 仅使用 2008 年可用的功能..

.edmx 文件内容是在编译时构建的,这意味着您无法在 运行 时更改此行为。

这意味着您有 2 个选择。

  1. 指向您要使用的最低 Sql 服务器版本,正如 @marc_s 在评论中指出的那样。这是您已经在使用的解决方案,它不是解决方法,而是它的工作方式。
  2. 如果你想在你的应用程序中支持多个Sql服务器版本,你必须为每个你想要的Sql服务器版本创建1个发布包支持。如果 .edmx 文件包含在一个单独的项目中,或者如果您只有一个 MVC 项目,则发布包可能是 dll 的替代品。这将涉及在每次编译之前将 ProviderManifestToken 更新到适当的版本并将正确的版本部署到客户端/服务器。