在VS10+Server08中使用EF4.4,发布数据库为SQL05,发生错误的问题
问题描述
环境描述:工具为VS2010+SQL08 R2,EntityFramework版本为4.4(在Framework4.5中为5.0),在本机完全测试完成后,发布到服务器上(Server 2008 R2+Sql 2005)时,会出现错误。
解决方案
在Windows资源管理器中找到实体模型文件(后缀为edmx),用记事本打开后,可看到如下内容:
在图片中框选部分,默认是2008,修改为2005.则不会将达datetime类型转换为数据库的datetime2类型,所以解决问题。
原因分析
通过查找资料得知:
ProviderManifestToken 是 Entity Data Model (EDM) 内存储架构定义语言 (SSDL) 中的 Schema 元素的必需属性。此标记用于为脱机方案加载提供程序清单。
打开存储连接时,提供程序可以获取所有需要的信息以选择要返回的正确清单。这在脱机方案中可能做不到,此时,连接信息不可用或无法连接到存储。对于这些情况,Entity Framework 在 SSDL 中存储了一个提供程序清单标记,足够提供程序用来标识清单。
该标记没有特定的架构;要由提供程序来选择在不打开到存储的连接的情况下标识清单所需的最少信息。
下面的“提供程序清单标记”示例显示了 ProviderManifestToken 属性中捕获的 SQL Server 版本信息。
<Schema Namespace="Test.Simple.Target" Alias="Self" Provider="System.Data.SqlClient"ProviderManifestToken="2005"xmlns:edm="http://schemas.microsoft.com/ado/2006/04/edm/ssdl"xmlns="http://schemas.microsoft.com/ado/2006/04/edm/ssdl"></Schema> 注->该段内容摘自:http://msdn.microsoft.com/zh-cn/library/bb896311%28v=VS.90%29.aspx
在资料得知,在EF4.x中,默认会将C#的Datetime类型转换为数据库的datetime2类型,所以导致该错误。修改为05后,会强制EF使用datetime类型,所以在SQL 2005中可以使用。默认转换为datetime2,通过SQL Server Profiler监视sql语句可看到。