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
相关问题