是否可以以编程方式为代码优先EF模型设置ProviderManifestToken?

时间:2012-01-13 23:12:56

标签: sql-server-2008 sql-server-2005 entity-framework

我们有一个环境,每个客户都有自己的数据库实例(具有相同的模式,用于所有意图和目的)。我们有一个仪表板应用程序,客户端可以登录该应用程序以对其特定数据库中的数据执行CRUD操作。我们使用单个代码优先EF模型与数据库进行交互。 (对于正在查看的任何客户端,我们只是在实例化DbContext时传递该客户端的数据库连接字符串。)

但是,数据库实例是SQL Server 2005和2008的混合。(我非常确定这是我们所看到的问题的根源。)

在特定页面上,我们开始发现以下错误:

  

正在使用的SQL Server版本不支持数据类型' datetime2'。

从谷歌搜索和StackOverflowing,我得出结论,这可能是由于ProviderManifestToken上的DbContext配置错误。

但是,错误是零星的。根据生产错误日志,我可以查看发生错误的同一客户端,并执行相同的CRUD操作而不会收到错误。

我不知所措。

甚至可以以编程方式设置ProviderManifestToken吗?或者默认连接工厂可能没有正确设置它(我可以做些什么来帮助它)?还是我离开基地?有什么想法吗?

顺便说一句......

发生错误的实体有2 datetime列,这两列都可以为空(最近的错误有null和2012年1月13日作为这些字段的值,所以我非常确定this answer关于确保值在datetime范围内的内容并不适用。

2 个答案:

答案 0 :(得分:0)

嗯,还没有解决方案。但我们现在想出了一个解决方法。

如果我们重新启动应用程序池,然后立即访问客户端仪表板以获取2008支持的客户端,EF将生成并缓存基于SQL Server 2008约束的映射,并且所有2008支持的仪表板工作得很好,但2005年支持的仪表板写入时失败datetime2错误。

但是,如果我们重新启动应用程序池,然后立即访问2005年支持的客户端仪表板,EF将生成并缓存基于SQL Server 2005约束的映射(允许该模型与2005和2008数据库实例一起使用)

因此,基本上,我们的发布流程现在可以立即访问2005年支持的仪表板。

答案 1 :(得分:0)

感谢您发布此内容。访问SQL2008数据库而不是SQL2005数据库的控制台应用程序遇到了同样的问题,并遇到了同样的问题。我切换它所以它首先是SQL2005,而不是SQL2008,问题就消失了。我也是先使用EF代码。