本鱼拟成立工作室承接项目开发/软件定制/云设施开发运维/办公设备技术支持等,如您有相关需求,欢迎来询 | ::博客文章推荐::

ADO.NET Entity Framework 运行在低版本 SQL Server上需要注意的两个问题

: ORM 木魚 2986℃ 0评论

因为种种种种关系,开发用的数据库是Sql Server2008但是产品服务器是SQL Server2000,所以导致了问题的发生。

 

问题一:存取包含“DateTime”数据类型的列时会引发异常

异常信息the version of SQL Server in use does not support datatype 'datetime2'

出现这个异常是因为SQL2008中加入了一个新的类型“DateTime2”,但是在SQL2005以及SQL2000中都不存在这个数据类型。这是一个已知的缺陷,可以手动解决。

用记事本或其它文本工具打开 *.edmx 文件,搜索 ProviderManifestToken="2008″ ,然后将 2008 更改为 2005 保存,并重新编译即可。当在IDE中更改后,这里会被重新修改回2008,需要再次修改。

关于这个异常的更多信息,可以参考这个链接:http://msdn.microsoft.com/en-us/library/bb896273.aspx

 

 

问题二:执行 FirstOrDefault() 的时候会发生SQL错误

在EF中,SingleOrDefault() 是不被支持的,因此会建议使用 FirstOrDefault() 来代替它。但是因为面对的数据库版本比较高的关系,生成的SQL语句会发生兼容性问题,导致这样的异常出现:

第 1 行: '(' 附近有语法错误。

说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Data.SqlClient.SqlException: 第 1 行: '(' 附近有语法错误。

ef_on_sql2k

 

因为EF生成的SQL语句中,FirstOrDefault() 会生成类似的语句:


SELECT TOP (1) ....

在 1 两边的括号会导致这个问题的发生。要解决这个问题,方法与问题一中的类似,不同的是把 2008 改成更低的 2000 即可。

 

总的感觉,EF不够成熟,当然这与我对它的掌握可能有一定关系,感觉不如LINQ灵活,虽然LINQ就一根筋。

喜欢 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址