申请表:
此问题与自动生成的edmx文件的ProviderManifestToken
属性有关。
根据使用的数据库版本(不同开发人员具有不同版本的数据库)从数据库更新模型,ProviderManifestToken
属性的值设置为2008或2012.直到我们停止支持SQL Server 2005,我们确保此属性的值仍为2005(有关详细信息,请参阅this SO article)。
我想知道2008年和2012年之间是否存在类似问题。这个属性到底有什么作用?我可以安全地将其保留为任何值,而不会在运行时造成任何问题吗?或者我应该确保始终将其设置为2008或始终设置为2012以确保应用程序与我们支持的数据库版本一起正常工作?
MSDN在描述此属性时不是很有用。它声明ProviderManifestToken
是
标识数据库服务器版本的字符串 用过的。例如,SQL Server提供程序使用字符串“2008” SQL Server 2008.这不能为空,但可能为空。
谢谢!
答案 0 :(得分:7)
从EF 6.1.2起,如果2012
为ProviderManifestToken
值,将导致EF使用offset ... fetch ...
语法生成SQL(MS Sql 2008不支持),例如分页。
因此,如果您将其更改为2012
,则很可能在运行MS Sql 2008的应用程序上遇到麻烦。
将其设置为2008
以便在较新的Sql Server上运行现在应该是安全的:在v + 2(其中v是不推荐使用它们的第一个版本)之前,不推荐使用不推荐使用的功能。对不起,我无法找到此声明的参考资料。
如果您需要使其与每个部署的目标数据库相匹配,this other SO answer可能会对您有所帮助。
如果您希望在任何情况下将其设置为2008
,请确保将开发DB设置为100
(SQL Server 2008)兼容级别。
不幸的是,看起来EF设计师并不总是尊重运行它来更新模型的数据库的兼容级别。因此,在使用它时,它可能会升级" ProviderManifestToken
值,如果开发者提交它并导致它被部署,就会造成麻烦。
我无法在自己的工作站上复制它。但是我公司的一些开发人员遇到了麻烦,尽管他们声称他们的本地数据库处于100
兼容级别。
看来他们没有正确设置SQL Server Management Studio(SSMS)默认脚本选项。 (Tools
=> Options...
=> SQL Server Object Explorer
=> Scripting
=> Script for server version
)。为了以防万一,我让他们改变它,现在他们报告不再有不受欢迎的ProviderManifestToken
值升级。
这对我来说很奇怪,因为SSMS选项不会对EF设计师产生任何影响。只有运行设计者的数据库才应考虑到恕我直言。正如已经说过的那样,即使调整了这个选项,我也无法自己重现这个问题。
答案 1 :(得分:0)
我通过安装Visual Studio 2012的Entity Framework 6工具解决了这个问题,我从这里下载了它:
https://www.microsoft.com/en-us/download/details.aspx?id=40762
希望这会有所帮助......