首页 新闻 会员 周边 捐助

如何强制EF生成SQL Server 2008支持的SQL语句

0
悬赏园豆:30 [已解决问题] 解决于 2016-02-02 20:24

如果Entity Framework连接的数据库服务器是SQL Server 2014,会生成SQL Server 2014支持的SQL语句,比如分页查询SQL语句:

OFFSET 0 ROWS FETCH NEXT 25 ROWS ONLY 

请问如何强制EF生成SQL Server 2008支持的SQL语句?

【相关链接】

Generating SQL2012 specific code when using 2008R2

ef
dudu的主页 dudu | 高人七级 | 园豆:29570
提问于:2016-01-30 18:39
< >
分享
最佳答案
1

EF生成的SQL语句类型和edmx文件第一次生成时连接的数据库版本相关的,即使后来换了其他版本的数据库,SQL语句貌似也不会有变化,这导致我之前一个项目在运行环境老是出问题。

我的开发环境是 SQL Server 2005 SP4,运行环境是SQL Server 2014 SP1,按理说生成的SQL2005类型的语句,在运行环境中应该兼容的,然而实际上却导致模型检查异常。

这是EF的设计问题,无论是 Code First 还是 DB First,任何通过EF产生的查询都是基于EF模型来的,而产生模型是建立在数据库类型和版本确定的情况下,EF以后可能还会支持Oracle、MySQL等其他数据库,因此按照EF的逻辑,一定是先根据数据库类型和版本建立模型,再生成SQL语句的;如果修改了数据库连接字符串,那么必然要重新生成模型的。

另1,可以通过修改edmx文件,来改变生成语句的类型,使用文本编辑器打开edmx文件,找到ProviderManifestToken键,修改其值,然后在VS中打开edmx视图并保存。这实际上重新生成了模型,只是比删掉edmx再重建来的方便点。

另2,Service Pack 版本也会影响EF模型检查。

收获园豆:30
飞扬的尘埃 | 小虾三级 |园豆:1318 | 2016-02-02 17:49

在基于 EF 6.x 的情况下,变通的做法:

1、保持开发环境的SQL Server版本和运行环境一致,包括SP。

2、考虑使用多个DbContext实例。

飞扬的尘埃 | 园豆:1318 (小虾三级) | 2016-02-02 17:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册