ADO.NET Entity Framework 在低版本 SQL Server的问题
因为种种种种关系,开发用的数据库是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生成的SQL语句中,FirstOrDefault() 会生成类似的语句:
SELECT TOP (1) ....
在 1 两边的括号会导致这个问题的发生。要解决这个问题,方法与问题一中的类似,不同的是把 2008 改成更低的 2000 即可。
总的感觉,EF不够成熟,当然这与我对它的掌握可能有一定关系,感觉不如LINQ灵活,虽然LINQ就一根筋