能否通过编程方式设置Code First EF模型的ProviderManifestToken?

4
我们的环境中,每个客户都有自己的数据库实例(在所有意义上来说,这些实例具有相同的模式)。我们有一个仪表板应用程序,客户可以登录以执行其特定数据库中数据的CRUD操作。我们使用单个基于代码优先的EF模型与数据库交互。(对于正在查看的任何客户端,我们只需在实例化DbContext时传递该客户端数据库的连接字符串即可。)
然而,数据库实例是SQL Server 2005和2008的混合。(我很确定这是我们看到的问题的根源。)
在特定页面上,我们开始看到以下错误发生:
“正在使用的SQL Server版本不支持数据类型'datetime2'。”
通过谷歌和StackOverflow,我得出结论,这可能是由于DbContext上的错误配置的ProviderManifestToken导致的。
但是,错误是零星发生的。根据生产错误日志,我可以查看发生错误的同一客户端并执行相同的CRUD操作,而没有出现错误。
我感到困惑。
这是否有可能通过编程方式设置ProviderManifestToken?或者默认的连接工厂没有正确地设置它(我能做些什么来帮助它)?还是我完全错了?有任何想法吗?
顺便说一下...
发生错误的实体有2个datetime列,两者都可为空(最近的错误在这些字段中具有null和2012年1月13日的值,所以我相当确定this answer关于确保值在datetime范围内不适用。

你如何将连接字符串传递给上下文? - Ladislav Mrnka
@LadislavMrnka DbContext有一个构造函数重载,可以接受连接字符串。只要您连接的数据库与EF模型匹配,就可以开始使用了。基本思路在这里:https://gist.github.com/1614591 很多我们的实现被省略以保护无辜者 :) - Lobstrosity
2个回答

1

目前还没有解决方案。但我们找到了一个临时解决方法。

如果我们重新启动应用程序池,然后立即访问2008支持的客户端仪表板,EF将基于SQL Server 2008约束生成和缓存映射,所有支持2008的仪表板都可以正常工作,但是支持2005的仪表板在写入时会出现datetime2错误。

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

因此,基本上,我们的发布过程现在有了额外的步骤,即立即访问支持2005的仪表板。


0
谢谢您发布这个问题。我有一个控制台应用程序,访问了一个SQL2008数据库和一个SQL2005数据库,遇到了同样的问题。我把它改成先访问SQL2005,再访问SQL2008,问题就解决了。我还在使用EF Code First。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接