2017-09-08 26 views
0

EntityFramework使用的ProviderManifest向後兼容,特別是對於Oracle和SQL Server?實體框架中ProviderManifests的向後兼容

我正在創建一個DbProviderInfo類的實例傳遞給DbModel.Build()。構造函數的第二個參數是ProviderManifestToken。

隨着documentation說,該ProviderManifestToken是:

標識數據庫服務器是 的版本中使用的字符串。例如,SQL Server提供程序使用字符串「2008」作爲SQL Server 2008的 。它不能爲空,但可能爲空。

有一個相關的未回答的問題here詢問ProviderManifestInfo的作用。從閱讀this page我明白,它允許數據庫提供商確定哪個版本的ProviderManifest返回,而不使用數據庫連接。 (ProviderManifest的功能也在最後一個鏈接中進行了說明)。

實驗中,我發現我可以使用Oracle 12數據庫,ProviderManifestToken爲「11.2」,沒有任何問題。但是,這應該是真實的一般?例如,如果我通過「2008」作爲ProviderManifestToken並且正在使用SQL Server 2012,那麼我能期待「事情」能夠正常工作嗎?

我一直無法找到關於這一點的任何文檔,如果事情從提供者到提供者不同,我不會感到驚訝。

回答

0

但是這是否應該是真的一般?例如,如果我通過「2008」作爲ProviderManifestToken並且正在使用SQL Server 2012,那麼我能期待「事情」能夠正常工作嗎?

是的,取決於數據庫提供者的向後兼容性。至少Oracle和SQL Server非常不願意在新版本的數據庫中打破現有應用程序,因此爲舊版本編寫的應用程序通常可以正常工作。

ProviderManifestToken的主要目的是允許EF爲數據庫提供者使用新功能,而不放棄對舊版本的支持。例如,SQL Server在SQL 2012中引入了OFFSET .. FETCH分頁。如果沒有ProviderManifestToken,EF將不得不選擇使用較早的查詢表單進行分頁(基於ROW_NUMBER()),或者刪除對SQL 2008的支持。

It EF可能會生成一個查詢,該查詢在更高版本中無法正常工作,這將成爲EF中的一個錯誤。但我不知道有這種情況。