实体框架中ProviderManifests的向后兼容性

时间:2017-09-08 21:42:39

标签: c# .net sql-server oracle entity-framework

EntityFramework使用的ProviderManifests是否向后兼容,特别是对于Oracle和SQL Server?

我创建了一个DbProviderInfo类的实例,以传递给DbModel.Build()。构造函数的第二个参数是ProviderManifestToken。

正如documentation所说,ProviderManifestToken是:

  

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

有一个相关的,未回答的问题here询问ProviderManifestInfo的作用。从阅读this page我明白,它允许数据库提供程序确定要返回的ProviderManifest版本,而不使用数据库连接。 (ProviderManifest所做的工作也在最后一个链接上进行了解释。)

通过实验,我发现我可以使用带有#34; 11.2"的ProviderManifestToken的Oracle 12数据库。没有问题。但这一般应该是真的吗?例如,如果我通过" 2008"作为ProviderManifestToken,我正在使用SQL Server 2012,我可以期待'事情'工作好吗?

我一直无法找到关于这一点的任何文件,如果提供者与提供者的情况不同,我也不会感到惊讶。

1 个答案:

答案 0 :(得分:0)

  

但这一般应该是真的吗?例如,如果我将“2008”作为ProviderManifestToken传递并且我使用的是SQL Server 2012,那么我可以期待“事情”正常工作吗?

是的,取决于数据库提供程序的向后兼容性。至少Oracle和SQL Server非常不愿意破坏新版本数据库中的现有应用程序,因此为旧版本编写的应用程序通常可以正常工作。

ProviderManifestToken的主要目的是允许EF为数据库提供程序使用新功能,而不会放弃对旧版本的支持。例如,SQL Server在SQL 2012中引入了OFFSET .. FETCH分页。如果没有ProviderManifestToken,EF必须在使用旧的查询表单进行分页(基于ROW_NUMBER())或删除对SQL 2008的支持之间进行选择。

EF可能会生成一个在更高版本上无法正常运行的查询,这将是EF中的一个错误。但我不知道有这种情况。