ProviderManifestToken 2008或2012

时间:2014-12-22 21:53:47

标签: .net sql-server entity-framework entity-framework-6

申请表:

  • .NET 4.5 C#
  • 使用EF6和数据库第一种方法
  • 支持SQL Server 2008R2,2012和2014

此问题与自动生成的edmx文件的ProviderManifestToken属性有关。

根据使用的数据库版本(不同开发人员具有不同版本的数据库)从数据库更新模型,ProviderManifestToken属性的值设置为2008或2012.直到我们停止支持SQL Server 2005,我们确保此属性的值仍为2005(有关详细信息,请参阅this SO article)。

我想知道2008年和2012年之间是否存在类似问题。这个属性到底有什么作用?我可以安全地将其保留为任何值,而不会在运行时造成任何问题吗?或者我应该确保始终将其设置为2008或始终设置为2012以确保应用程序与我们支持的数据库版本一起正常工作?

MSDN在描述此属性时不是很有用。它声明ProviderManifestToken

  

标识数据库服务器版本的字符串   用过的。例如,SQL Server提供程序使用字符串“2008”   SQL Server 2008.这不能为空,但可能为空。

谢谢!

2 个答案:

答案 0 :(得分:7)

从EF 6.1.2起,如果2012ProviderManifestToken值,将导致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

希望这会有所帮助......