如果Entity Framework连接的数据库服务器是SQL Server 2014,会生成SQL Server 2014支持的SQL语句,比如分页查询SQL语句:
OFFSET 0 ROWS FETCH NEXT 25 ROWS ONLY
请问如何强制EF生成SQL Server 2008支持的SQL语句?
【相关链接】
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模型检查。
在基于 EF 6.x 的情况下,变通的做法:
1、保持开发环境的SQL Server版本和运行环境一致,包括SP。
2、考虑使用多个DbContext实例。