ProviderManifestToken 2008或2012

Sum*_*arg 5 .net sql-server entity-framework entity-framework-6

应用程序:

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

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

根据使用的数据库版本(不同开发人员具有不同版本的数据库)从数据库更新模型,ProviderManifestToken属性的值可以设置为2008或2012.在我们停止支持SQL Server 2005之前,我们确保该属性的值保持为2005(有关更多信息,请参阅此SO文章).

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

MSDN在描述此属性时不是很有用.它指出ProviderManifestToken

一个字符串,用于标识正在使用的数据库服务器的版本.例如,SQL Server提供程序对SQL Server 2008使用字符串"2008".这不能为null,但可能为空.

谢谢!

Fré*_*ric 7

从EF 6.1.2开始,具有2012as ProviderManifestToken值将导致EF offset ... fetch ...在一些情况下使用语法(在MS Sql 2008中不支持)生成SQL ,例如分页.所以,如果你改变它2012,你很可能会遇到运行在MS Sql 2008上的应用程序的麻烦.

将其设置2008为在较新的Sql Server上运行应该是安全的:不推荐使用不推荐的功能直到v + 2(其中v是不推荐使用它们的第一个版本).对不起,我无法找到此声明的参考.

如果您需要使其与每个部署的目标数据库匹配,则此其他SO答案可能对您有所帮助.

如果您希望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设计师产生任何影响.只有运行设计者的数据库才应考虑到恕我直言.正如已经说过的那样,即使调整了这个选项,我也无法自己重现这个问题.