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